Как я могу получить доступ к ResourceDictionary в wpf из кода С#?
У меня есть DataTemplate
, определенный в файле xaml, который я хочу получить с помощью кода С#.
Может ли кто-нибудь рассказать мне, как я могу получить к нему доступ?
Я добавил новый ResourceDictionary
файл и его имя Dictionary1.xaml. У меня есть шаблон данных, например:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate x:Key="mytemplate">
<TextBlock Text="Name:" Background="Blue"/>
</DataTemplate>
</ResourceDictionary>
не имеет ListBox
, называемый listBox1, и я хочу присвоить ему свойство Itemtemplate
но я не понимаю, как это сделать?
Ответы
Ответ 1
Где именно вы его определяете?
Если вы определяете его в ResourceDictionary вашего объекта, то
Application.Current.Resources[typeof(yourDataTemplateTargetType)]
должен работать. Если вы определяете его как член чего-то другого, например, например, элемента управления ItemsControl, вам нужно получить дескриптор экземпляра ItemsControl и вызвать свойство ItemTemplate.
Изменить: Хорошо, я думаю, что мы куда-то добираемся. Таким образом, вы определяете ResourceDictionary в своем собственном файле. Прежде чем вы сможете использовать его в своем пользовательском интерфейсе и получить доступ к нему из своего кода, вам необходимо объединить этот ResourceDictionary в ваше приложение. Вы делаете это?
Если вы, то следующим шагом будет получение этого ресурса. Каждый элемент FrameworkElement имеет метод FindResource. Этот метод велик, потому что он просматривает дерево ResourceDictionary и пытается найти ресурс с помощью ключа. Итак, если вы хотите получить доступ к этому ресурсу из UserControl, вы можете сделать следующее в коде:
FindResource(typeof(yourDataTemplateTargetType));
Если это не сработает для вас, пожалуйста, покажите нам, как именно вы объявляете этот ресурсный словарь и как он объединяется в ваши ресурсы приложения.
Ответ 2
Так как Application.Current
был null в моем случае, я в конечном итоге использовал это:
var myResourceDictionary = new ResourceDictionary();
myResourceDictionary.Source =
new Uri("/DllName;component/Resources/MyResourceDictionary.xaml",
UriKind.RelativeOrAbsolute);
а затем получить указанный ключ, который мне нужен, используя
myResourceDictionary["KeyName"] as TypeOfItem
(source)
Ответ 3
Если вы, например, имеете шаблон для Button в своем ресурсном словаре в файле App.xaml, вы можете получить к нему доступ, используя следующий код:
Application.Current.Resources[typeof(Button)]
Ответ 4
Доступ к ресурсному словарю, добавленному в проект, можно получить следующим образом:
var rd = new ResourceDictionary();
rd.Source = new Uri("ms-appx:///Dictionary1.xaml");
Затем вы можете получить доступ к ресурсу, хранящемуся в словаре ресурсов, например:
someObject.Property = rd["mytemplate"];
Примечание:
Вам нужно будет изменить URI на словарь ресурсов в соответствии с местоположением, созданным вами относительно базового каталога проекта.
Ответ 5
Любой из вышеперечисленных подходов работает с получением ресурса на основе местоположения, если вы следуете MVVMm, я бы рекомендовал сделать это следующим образом:
- создайте службу, например ProvideDataTemplateService, (чтобы создать обычную службу наследования от поведения)
- Используйте контейнер по вашему выбору, чтобы ввести эту услугу, где вы хотели бы иметь тузы в DataTemple.