Как объединить импортированные и локальные ресурсы в пользовательском управлении WPF
Я пишу несколько пользовательских элементов управления WPF, которым нужны как общие, так и индивидуальные ресурсы.
Я понял синтаксис для загрузки ресурсов из отдельного файла ресурсов:
<UserControl.Resources>
<ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>
Однако, когда я это делаю, я не могу также добавлять ресурсы локально, например:
<UserControl.Resources>
<ResourceDictionary Source="ViewResources.xaml" />
<!-- Doesn't work: -->
<ControlTemplate x:Key="validationTemplate">
...
</ControlTemplate>
<style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
...
</style>
...
</UserControl.Resources>
Я посмотрел на ResourceDictionary.MergedDictionaries, но это только позволяет мне объединять более одного внешнего словаря, а не определять дополнительные ресурсы локально.
Мне нужно пропустить что-то тривиальное?
Следует отметить: я размещаю свои пользовательские элементы управления в проекте WinForms, поэтому размещение общих ресурсов в App.xaml на самом деле не является вариантом.
Ответы
Ответ 1
Я понял это. Решение включает в себя MergedDictionaries, но особенности должны быть в порядке, например:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ViewResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- This works: -->
<ControlTemplate x:Key="validationTemplate">
...
</ControlTemplate>
<style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
...
</style>
...
</ResourceDictionary>
</UserControl.Resources>
То есть локальные ресурсы должны быть вложенными внутри тегом ResourceDictionary. Таким образом, пример здесь неверен.
Ответ 2
Используйте MergedDictionaries.
Я получил следующий пример здесь.
Файл1
<ResourceDictionary
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " >
<Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
<Setter Property="FontFamily" Value="Lucida Sans" />
<Setter Property="FontSize" Value="22" />
<Setter Property="Foreground" Value="#58290A" />
</Style>
</ResourceDictionary>
Файл 2
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="TextStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Ответ 3
Вы можете определить локальные ресурсы в разделе MergedDictionaries:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- import resources from external files -->
<ResourceDictionary Source="ViewResources.xaml" />
<ResourceDictionary>
<!-- put local resources here -->
<Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
...
</Style>
...
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>