WPF在generic.xaml模板中使用图像

时间:2014-02-05 18:58:39

标签: c# wpf xaml templates generic.xaml

我正在为直接从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外部引用的。

3 个答案:

答案 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" />