如何在WPF用户控件中结合导入和本地资源


82

我正在编写几个需要共享和单独资源的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并不是一个真正的选择。

Answers:


157

我想到了。该解决方案涉及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标记内。因此,此处的示例不正确。


5

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

5

使用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> 

谢谢,但是没有运气。他的例子似乎正确,但实际上不起作用。我收到消息“属性'Resources'设置不止一次”。
Tor Haugen

我知道MergedDictionaries。但是,它们不允许我以我想要的方式将外部字典引用与本地定义的资源组合在一起。如前所述,您引用的页面上有一个示例,但是它不起作用。
Tor Haugen

2
对于任何获得“多次设置”错误的人:其他所有资源都必须位于第一个<ResourceDictionary>标记内。
Hexo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.