Подтвердить что ты не робот

Как я могу получить доступ к 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 но я не понимаю, как это сделать?

4b9b3361

Ответ 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.