如何在 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>

我看了一下资源词典。MergedDictionaries,但这只能让我合并多个外部字典,而不能在本地定义更多资源。

我一定是漏掉了什么细枝末节?

应该提到的是: 我在一个 WinForms 项目中托管我的用户控件,所以在 App.xaml 中放置共享资源实际上不是一个选项。

54295 次浏览

使用 合并词典

我从 给你。中得到了下面的例子

档案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>

我想出来了。解决方案包括合并字典,但细节必须恰到好处,像这样:

<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 标记 内心中。

您可以在 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>