将单独文件中的普通 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.xaml
为MergedDictionaries
<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 元素添加到资源字典中的主要内容,如果未能解决你的问题,请参考以下文章