Загрузка ресурса с исключением исключений Findresource - WPF / C # - PullRequest
4 голосов
/ 03 февраля 2009

Я пишу CustomControl в WPF. У меня есть несколько DataTemplates в моем Themes / Generic.xaml, на уровне ресурсов, для которых назначен x: Key.

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

Я пытался использовать base / this.FindResource ("keyvalue"), this.Resources [""] и т. Д.

Он продолжает возвращать, что ресурс не найден и, следовательно, нулевой.

Ресурс обязательно находится в generic.xaml.

Пожалуйста, помогите.

Ответы [ 7 ]

7 голосов
/ 14 августа 2009

Немного опоздал с ответом, но это могло бы принести пользу другим.

Ресурс, к которому вы пытаетесь получить доступ, на уровне темы , чтобы получить к нему доступ из любой точки вашей сборки, он должен быть идентифицирован посредством ComponentResourceKey:

<Style TargetType="{x:Type TreeViewItem}" 
       x:Key="{ComponentResourceKey {x:Type local:MyTVIStyleSelector}, tviBaseStyle}">
  <!-- style setters -->
</Style>

тогда в вашем XAML вы будете ссылаться на это так:

<Style TargetType="{x:Type TreeViewItem}" 
       x:Key="{ComponentResourceKey {x:Type local:MyTVIStyleSelector}, tviStyle_1}"
       BasedOn={StaticResource {ComponentResourceKey {x:Type local:MyTVIStyleSelector}, tviBaseStyle}}>
  <!-- style setters -->
</Style>

и в вашем коде так:

ComponentResourceKey key = new ComponentResourceKey(typeof(MyTVIStyleSelector), "tviStyle_1");
Style style = (Style)Application.Current.TryFindResource(key);

Существует также многословная форма синтаксиса XAML, которая выглядит следующим образом (но это одно и то же):

<Style TargetType="{x:Type TreeViewItem}" 
       x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:MyTVIStyleSelector}, ResourceId=tviBaseStyle}">
  <!-- style setters -->
</Style>

Обратите внимание, что хотя TypeInTargetAssembly должна быть установлена, она не ограничивает доступ к этому ресурсу для других типов в сборке.

3 голосов
/ 05 февраля 2009

Убедитесь, что вы на самом деле добавили пользовательский элемент управления в качестве дочернего элемента к другому элементу управления, прежде чем использовать для него FindResource. Я уверен, что когда вы используете FindResource, он поднимается по иерархии элементов управления, пока не найдет совпадение. Если у вашего элемента управления нет родителя, он не найдет искомый ресурс.

2 голосов
/ 10 июня 2011

Вы можете загрузить словарь ресурсов следующим образом:

ResourceDictionary myDictionary = Application.LoadComponent(new Uri("/MyAssembly;component/Themes/Generic.xaml", UriKind.RelativeOrAbsolute)) as ResourceDictionary;

Затем вы можете найти ресурсы внутри него обычным способом, например, myDictionary ["keyvalue"]

1 голос
/ 03 мая 2011

x: Key и DataType взаимно исключены. Внутренне, если вы установите DataType, WPF генерирует ключ типа DataTemplateKey. Таким образом, вызов FindResource с ComponentResourceKey вызывает исключение, потому что ресурс не может быть найден с этим ключом. Используйте

frameworkElement.FindResource(new DataTemplateKey(typeof(yourType)));

для DataTemplate с определенным DataType = {x: Тип local: yourType} или

frameworkElement.FindResource(new ComponentResourceKey(typeof(yourType), "ressId"));

для DataTemplate с определением x: Key = {ComponentResourceKey TypeInAssembly = {x: Тип l: yourType}, ResourceId = ressId}. Не определяйте DataType и x: Введите один и тот же шаблон.

1 голос
/ 03 февраля 2009

Поскольку вы создаете пользовательский элемент управления, я предполагаю, что у вас есть ControlTemplate, определенный в вашем файле generic.xaml? Если это так, то если вы добавите свой DataTemplate (s) в раздел «Ресурсы» ControlTemplate следующим образом:

<ControlTemplate>
    <ControlTemplate.Resources>
        <!-- Data Templates Here -->
    </ControlTemplate.Resources>

    <!-- Rest of Control Template -->
</ControlTemplate>

затем при условии, что шаблон элемента управления был применен / загружен, тогда вы сможете найти эти шаблоны данных, используя вызов this.FindResource () в вашем элементе управления.

0 голосов
/ 04 февраля 2009

Спасибо обоим.

Я попытался переместить ресурсы в раздел ресурсов CT. Даже тогда, когда я смотрю во время выполнения, скажем, в OnApplyTemplate или EndInit () и т. Д., В объекте this.Resources нет объектов :-( хотя все это является элементом Generic.xaml элемента управления.

Так что он всегда возвращает ноль.

0 голосов
/ 03 февраля 2009

Я не уверен, что думаю, что вам нужно определить в XAML, который вы используете, или статический ресурс с новым ключом x:, который соответствует тому, что вы хотите изменить.

другой вариант, если вы используете файл, содержащий шаблон, объедините ресурсы следующим образом:

<ResourceDictionary.MergedDictionaries>
  <ResourceDictionary Source="SomeTemplate.xaml"/>
</ResourceDictionary.MergedDictionaries>

в соответствующем месте вы попытаетесь найти ресурс

НТН, Eric

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...