Псевдоним или ссылка в ResourceDictionary

#wpf #resources #reference #alias #resourcedictionary

#wpf #Ресурсы #ссылка #псевдоним #resourcedictionary

Вопрос:

Я ищу способ по существу предоставить элемент в ResourceDictionary нескольких ключах. Есть ли способ сделать это?

 <DataTemplate x:Key="myTemplate" ... />
<AliasedResource x:Key="myTemplateViaAlias" Target="myTemplate" OR_Target={StaticResource myTemplate} />
  

Когда я вызываю TryFindResource("myTemplateViaAlias") , я хочу получить MyTemplate. Полагаю, я мог бы сам создать AliasedResource класс и разыменовывать его в коде, когда извлекаю из словаря, но я бы предпочел этого не делать, если есть встроенный способ.

Ответ №1:

Вы можете передавать ресурсы через динамические ресурсы (обратите внимание, что дерьмовым дизайнерам пользовательского интерфейса это не понравится)

 <Color x:Key="color">Red</Color>
<DynamicResource x:Key="mycolor" ResourceKey="color"/>
  
 <Rectangle Width="100" Height="100">
    <Rectangle.Fill>
        <SolidColorBrush Color="{StaticResource color}"/>
    </Rectangle.Fill>
</Rectangle>
<Rectangle Width="100" Height="100">
    <Rectangle.Fill>
        <SolidColorBrush Color="{StaticResource mycolor}"/>
    </Rectangle.Fill>
</Rectangle>
  

Комментарии:

1. Отлично, спасибо. Теперь мне просто нужно подождать 8 минут, чтобы принять.

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

3. Для ресурсов пользовательского интерфейса динамические ресурсы действительно работают в Blend. Просто не будет загружаться по умолчанию без добавления словаря.

4. @Дэнни Варод: Я не понимаю, что вы имеете в виду под своим первым комментарием… (Когда я сказал «дерьмовые дизайнеры пользовательского интерфейса», я, очевидно, имел в виду Visual Studio)

5. В вопросе был DataTemplate, обычно используемый для определения того, как определенный тип данных представлен в пользовательском интерфейсе. Поскольку пользовательский интерфейс может быть привязан к нескольким типам данных, вызов шаблона данных по имени во многих случаях проблематичен (если пользовательский интерфейс не предназначен только для одного типа данных). Однако для оформления, как в примере вашего ответа, это имеет смысл.

Ответ №2:

Я не знаю способа сделать это.

Однако, если ваша цель — несколько шаблонов для нескольких элементов управления, возможно, вы идете по неверному пути.

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