Система доступа: словарь строковых ресурсов XAML в C#
Как получить доступ к содержимому словаря ресурсов с помощью C#?
Например, вот мой код в XAML:
<system:String x:Key="NewGroup">New Group Name</system:String>
И я хочу получить доступ к нему здесь, в C#:
private void OnAddGroup(object sender, ExecutedRoutedEventArgs e)
{
BooksGroupInfo group = new BooksGroupInfo();
group.GroupName = "New Group" + TheTabControl.Items.Count;
TabItem tab = AddGroup(group);
_currentLibrary.addGroup(group);
_currentLibrary.CurrentGroup = group;
}
Вместо того, чтобы вводить "New Group" в C#, я хотел бы заменить это и иметь доступ к словарю ресурсов в XAML. Таким образом, команда автоматически получит Имя, которое есть в словаре ресурсов.
Я пробовал пару решений, таких как:
(System.String)this.FindResource("NewGroup");
Application.Current.Resources[typeof(System.String)];
и так далее... но они вроде не работают.
Я делаю локализацию, используя locbaml, и она не анализирует текст / имя на C# (или я не знаю, как), и это было единственное решение, которое я считал возможным.
2 ответа
Обычно используя FrameworkElement.FindResource, как это: string s = this.FindResource("NewGroup") as string;
работает. Более вероятно, что ресурс с ключом "NewGroup" не существует в области вашего элемента управления или окна (независимо от того, this
является). Вы должны убедиться, что ресурс есть. Например, если ваш ресурс взят из другого файла, вы должны использовать MergedDictionaries. Вы можете проверить, доступен ли ресурс на самом деле, попробуйте получить доступ к нему из XAML, который принадлежит вашему коду, где OnAddGroup
определен.
Я надеюсь, что в этом есть смысл.
Если вы не можете гарантировать существование своих ресурсов, используйте
FrameworkElement.TryFindResource
будет лучшим решением. Это похоже наFindResource
но вместо того, чтобы создавать исключение,TryFindResource
возвращаетnull
если ресурс с предоставленным ключом не найден. (РеализацияTryXxx()
методы называется TryGet Pattern.) Пример кода программной части XAML:
button.Content = this.TryFindResource("NewGroup");