我正在为直接从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,在themes目录中,我已将它添加到旧的资源页面,尝试将构建操作更改为资源,嵌入式资源,尝试手动复制图像构建目录,但无效。永远不会显示图像。
这必须与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外部引用的。
答案 0 :(得分:1)
在Generic.xaml
中访问图片并没有什么异常,您只是没有正确引用它。您可以使用以下格式引用项目程序集中的资源文件:
<Image Source="/AssemblyName;component/Subfolder/SmallHandle.png" />
如果您的图片直接位于项目根目录中(不推荐),那么您可以像这样访问它们:
<Image Source="/AssemblyName;component/SmallHandle.png" />
如果您的图片位于另一个项目的文件夹中,那么您可以像这样访问它:
<Image Source="/ReferencedAssembly;component/Subfolder/SmallHandle.png" />
有关详细信息,请参阅MSDN上的Pack URIs in WPF页面。
更新&gt;&gt;&gt;
在.NET 4中,上述Image.Source
值可以正常工作。但是,微软在.NET 4.5中做了一些可怕的改变,打破了很多不同的东西,因此在.NET 4.5中,你需要使用完整的pack
路径:
<Image Source="pack://application:,,,/AssemblyName;component/Images/image_to_use.png">
答案 1 :(得分:0)
如果你觉得你的generic.xaml没有被选中,你可以从你的App.cs.xaml中引用它:
<App.Resources>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MY.NAMESPACE;component/Themes/generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</App.Resources>
您的generic.xaml文件应标记为“资源”。
此外,您的图像文件应标记为“资源”。
最后,像这样引用你的ImageSource:
<Image Source="Themes/IMAGE.png" />
或尝试
<Image Source="../Themes/IMAGE.png" />
就个人而言,我喜欢将我的样式模板放在他们自己的.xaml文件中,并将它们全部引用为MergedDictionaries。
答案 2 :(得分:0)
Themes \ Generic样式中的键入基本样式仅自动应用于自定义控件。
如果您需要在用户控件中使用基于类型的样式,则需要将generic.xaml添加到用户控件资源。
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
还将图像源URI更改为
<Image Source="pack://application:,,,/WpfCustomControlLibrary1;component/SmallHandle.png" />