将单独的XAML导入为ResourceDictionary并分配x:Key
我下载了Visual Studio图像库 ,我看到包含的图标以.XAML文件的forms提供矢量格式。 这是一个例子:
Add_16x.xaml
我想将我想要在我的应用程序源中使用的所有图标xaml文件放在名为“Icons”的文件夹中,然后能够在其他地方IconDictionary.xaml
一个名为IconDictionary.xaml
的文件,该文件定义了一个包含MergedDictionaries
的ResourceDictionary
并在此MergedDictionaries
希望能够以某种方式包含icon.xaml文件并为它们分配一个x:Key
属性,以便我可以在整个应用程序中将它们称为静态资源。
是否可以使用此icon.xaml文件而无需修改.xaml文件本身?
我希望能够保留它们,但不幸的是,似乎我别无选择,只能将其内容复制到我的IconDictionary.xaml
或编辑单个.xaml文件并将它们包含在带有x:Key
的ResourceDictionary
x:Key
我可以添加到MergedDictionaries
x:Key
。
UPDATE
为了清楚起见,我希望我的IconDictionary.xaml看起来像这样:
是否可以使用此icon.xaml文件而无需修改.xaml文件本身?
我不相信。 虽然XAML看起来很像XML,并遵循许多XML规则,但XAML编译器似乎不允许通常用于将XML从一个文件导入另一个文件的DOCTYPE
和ENTITY
标记。 使用时,报告的第一个错误显示“此XML文档中禁止DTD” 。 如果没有提供DTD的能力,则无法声明实体,因此无法导入独立的XAML。
如果要直接使用生成的XAML文件,可以将该文件作为资源添加到项目中。 然后可以使用代码隐藏中的XamlReader.Load()
加载资源数据,并在您需要的适当时间添加。
例如,假设您已将XAML文件复制到项目中名为“Resources”的文件夹,并将文件的“Build Action”设置为“Resource” ,则可以编写这样的代码来检索对象:
using (Stream stream = App.GetResourceStream( new Uri("pack://application:,,,/Resources/Add_16x.xaml")).Stream) { object o = XamlReader.Load(stream); }
这将获得一个Stream
对象,该对象表示已嵌入应用程序中的XAML文件数据,然后使用XamlReader.Load()
方法加载XAML表示的WPF对象。
就个人而言,当我使用这些文件时,我只是将DrawingGroup
元素从XAML文件复制/粘贴到我自己的资源XAML文件中。 无论如何,包装器( Viewbox
, Rectangle
和DrawingBrush
)都是多余的。 我真正需要的是DrawingGroup
对象。
当我这样做时,我也删除了显式的
语法,并直接包含DrawingGroup
,使XAML更简洁。 例如:
然后,您可以随意使用上述资源。 例如,WPF中的惯用方法是声明一个DataTemplate
配置为以您想要的方式显示Drawing
,然后将给定的Drawing
资源绑定为内容控件的内容。 例如:
其他地方:
(确保内容控件的样式,例如Button
,否则与您的Drawing
资源兼容,即正确的大小等)
这个怎么样?
App.xaml中
并像这样使用它:
要么,
并像这样使用它: