#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:
Я не знаю способа сделать это.
Однако, если ваша цель — несколько шаблонов для нескольких элементов управления, возможно, вы идете по неверному пути.
У вас может быть несколько ресурсов (шаблоны данных и динамические ресурсы) с одним и тем же ключом с глобальным именем или ключом по умолчанию (тип класса управления) для стилей, а затем загружать разные файлы словаря ресурсов в каждый элемент управления / регион / вкладку / окно во время выполнения.