将单独文件中的普通 XAML 元素添加到资源字典中

Posted

技术标签:

【中文标题】将单独文件中的普通 XAML 元素添加到资源字典中【英文标题】:Add plain XAML element from separate file into resource dictionary 【发布时间】:2017-04-13 05:58:22 【问题描述】:

我有一个包含以下内容的 xaml 文件

图标.xaml

<Rectangle xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           x:Name="Icon"
           Width="16" Height="16">
<!-- Fancy DrawingBrush here to make a sweet icon -->
</Rectangle>

如您所见,文件中没有资源字典或自定义类。

现在我想将 Icon.xaml 包含在资源字典中,然后在我的代码中随处使用它:

<Button Content="StaticResource Icon"/>

但是,我不明白如何告诉资源字典只包含普通 XAML 文件的内容。

请注意,我并没有尝试在运行时加载 XAML 文件,Icon.xaml 已编译到应用程序中。

【问题讨论】:

这行不通。 ResourceDictionary 中的项目被实例化一次,然后在每个地方重用。这可以使用画笔和颜色来完成,但不能使用控件。一个控件不能有多个父级。您可以查看一个特殊的 VisualBrush,但它指出它不能被冻结,这可能意味着您不应该重复使用它。 【参考方案1】:

我做了一些调整,但这是我最终确定的代码:

我从 DrawingBrush 中删除了边界矩形,因为这是我真正想要的唯一东西:

图标.xaml

<DrawingBrush xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <DrawingBrush.Drawing>
        <DrawingGroup>
            <DrawingGroup.Children>
                <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
                <GeometryDrawing Brush="StaticResource IconForegroundBrush" Geometry="F1M8.999,1C7.814,1,6.666,1.422,5.768,2.188L3.992,3.692 3.992,1 1.994,3 1.994,5 1.994,6 1.994,7 5.99,7 7.988,5 5.54,5 7.061,3.713C7.6,3.253 8.289,3 8.999,3 10.651,3 11.996,4.346 11.996,6 11.996,6.877 11.613,7.708 10.936,8.29L5.34,13.252 6.664,14.748 12.248,9.797C13.358,8.846 13.994,7.461 13.994,6 13.994,3.243 11.753,1 8.999,1" />
            </DrawingGroup.Children>
        </DrawingGroup>
    </DrawingBrush.Drawing>
</DrawingBrush>   

我还将 Icon.xaml 的构建操作设置为 Resource 而不是 Page

我创建了一个帮助类 IconLocator 来为我加载图标:

public static DrawingBrush Icon => Load("Icon.xaml");

private static DrawingBrush Load(string fileName)

    var uri = new Uri(Prefix + fileName);
    var info = Application.GetResourceStream(uri);            
    var brush = XamlReader.Load(info.Stream) as DrawingBrush;

    return brush;

我现在可以在任何地方使用此绘图笔了:

<Border Background="x:Static res:IconLocator.Icon"/>

【讨论】:

【参考方案2】:

您是否尝试将其放入app.xamlMergedDictionaries

<Application x:Class="WPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
             <ResourceDictionary Source="FolderWhereIsYourIconXaml/Icon.xaml" />
          </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这样你就可以像StaticResource Icon这样称呼它

但您必须将其设为 ResouceDictionary。

【讨论】:

该文件不包含资源字典,因此我无法将其用作资源字典的来源。 我刚刚看到它不是 ResourceDictionary,但可能要使其成为 resourceDictionary 并在 Style TargetType=Control 内制作您的矩形。

以上是关于将单独文件中的普通 XAML 元素添加到资源字典中的主要内容,如果未能解决你的问题,请参考以下文章

wpf中资源文件字典如何使它也拥有cs文件

动态加载资源字典文件到wpf应用程序会出错

WPF学习笔记-使用自定义资源字典(style)文件

从 XAML 中的 *.resx 文件中获取值

如何将多个资源添加到XAML窗口?

通过多个 .xaml 文件进行数据绑定