我正在为直接从 Control 派生的自定义控件编写样式。Visual Studio 将“自定义控件 (WPF)”的样式放在 Themes\generic.xaml 文件中。我的样式包含我无法显示的图像,似乎关于如何从 generic.xaml 文件中设置图像的源有一些特别之处。
我设法用一个更简单的场景重现了这个问题。创建一个“WPF 自定义控件库”,然后在 Themes\generic.xaml 中为按钮添加样式。这是我完整的 generic.xaml:
<ResourceDictionary
...
<Style TargetType="{x:Type Button}">
<Setter Property="Content">
<Setter.Value>
<Image Source="SmallHandle.png"></Image>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
在此之后,我创建了一个 UserControl(在同一个项目中),其中只包含一个按钮(为了测试样式),如下所示:
<UserControl x:Class="BlendControls.UserControl1"
...
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Button/>
</UserControl>
我在项目根目录中添加了 SmallHandle.png,在主题目录中,我也将它添加到了良好的旧资源页面,尝试将构建操作更改为资源,嵌入资源,尝试手动将图像复制到构建目录,但没有效果。图像永远不会显示。
这必须与 generic.xaml 文件相关,因为将整个样式复制到放置 Button 的同一文件中可以正常工作。也就是说,以下工作按预期工作:
<UserControl x:Class="BlendControls.UserControl1"
...
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Content">
<Setter.Value>
<Image Source="SmallHandle.png"></Image>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Button></Button>
</UserControl>
那么,我应该如何从 generic.xaml 设置图像的来源?或者,我应该将自定义控件的样式/模板放在哪里?
- - 解决方案 - -
正如 Sheridan 所指出的,我必须使用“完整”包 URI 表示法:
pack://application,,,/MyAssembly;components/SmallHandle.png
这对我来说看起来很奇怪,因为图像在同一个程序集中。不确定,看起来我是从 dll 外部引用的。