Как я могу получить доступ к ResourceDictionary в wpf из кода C #? - PullRequest
58 голосов
/ 06 марта 2009

У меня есть DataTemplate, определенный в файле xaml, к которому я хочу получить доступ через код C #. Может кто-нибудь сказать, пожалуйста, как я могу получить к нему доступ? Я добавил новый файл 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 но я не понимаю, как я могу это сделать?

Ответы [ 5 ]

54 голосов
/ 02 сентября 2014

Так как Application.Current в моем случае было нулевым, я использовал это:

    var myResourceDictionary = new ResourceDictionary();
    myResourceDictionary.Source =
        new Uri("/DllName;component/Resources/MyResourceDictionary.xaml",
                UriKind.RelativeOrAbsolute);  

и затем получить указанный мне ключ, используя myResourceDictionary["KeyName"] as TypeOfItem

( источник )

52 голосов
/ 06 марта 2009

Где именно вы это определяете?

Если вы определите его в ResourceDictionary вашего объекта, то

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

должно работать. Если вы определяете его как элемент чего-то другого, например, ItemControl, вам нужно получить дескриптор экземпляра ItemsControl и вызвать свойство ItemTemplate.

Редактировать: Хорошо, я думаю, что мы куда-то добираемся. Итак, вы определяете ResourceDictionary в своем собственном файле. Прежде чем вы сможете использовать его в своем пользовательском интерфейсе и получить к нему доступ из своего кода, вам необходимо объединить этот ResourceDictionary с вашим приложением. Ты это делаешь?

Если да, то следующий шаг - получить этот ресурс. Каждый FrameworkElement имеет метод с именем FindResource . Этот метод хорош, потому что он просматривает дерево ResourceDictionary и пытается найти ресурс с помощью ключа. Итак, если вы хотите получить доступ к этому ресурсу из UserControl, вы можете сделать следующее в коде:

FindResource(typeof(yourDataTemplateTargetType));

Если это не работает для вас, пожалуйста, покажите нам, как именно вы объявляете этот словарь ресурсов и как он сливается с ресурсами вашего приложения.

7 голосов
/ 06 марта 2009

Если, например, у вас есть шаблон для Button в словаре ресурсов в файле App.xaml, вы можете получить к нему доступ, используя следующий код:

Application.Current.Resources[typeof(Button)]
1 голос
/ 13 августа 2016

Вы можете получить доступ к словарю ресурсов, добавленному в ваш проект, следующим образом:

var rd = new ResourceDictionary();
rd.Source = new Uri("ms-appx:///Dictionary1.xaml");

Затем вы можете получить доступ к ресурсу, хранящемуся в словаре ресурсов, например:

someObject.Property = rd["mytemplate"];

Примечание:
Вам придется изменить URI для словаря ресурсов в соответствии с местоположением, в котором вы его создали, относительно базового каталога проекта.

0 голосов
/ 22 ноября 2016

Любой из вышеперечисленных подходов работает с получением ресурса на основе местоположения, если вы используете MVVMm, я бы порекомендовал сделать это следующим образом:

  1. создать сервис, подобный ProvideDataTemplateService, (чтобы создать сервис, обычно наследуемый от поведения)
  2. Используйте контейнер по вашему выбору, чтобы добавить эту услугу туда, где вы хотели бы получить доступ к DataTemple.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...