0

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

4

3 回答 3

2

访问 中的图像没有什么不寻常的Generic.xaml,只是您没有正确引用它。您可以使用以下格式引用项目程序集中的资源文件:

<Image Source="/AssemblyName;component/Subfolder/SmallHandle.png" />

如果您的图像直接位于项目根目录中(推荐),那么您可以像这样访问它们:

<Image Source="/AssemblyName;component/SmallHandle.png" />

如果您的图像在另一个项目的文件夹中,那么您可以像这样访问它:

<Image Source="/ReferencedAssembly;component/Subfolder/SmallHandle.png" />

有关详细信息,请参阅MSDN 上的 WPF页面中的 Pack URI。


更新>>>

在 .NET 4 中,上述Image.Source值会起作用。但是,Microsoft 在 .NET 4.5 中做出了一些可怕的更改,破坏了许多不同的东西,因此在 .NET 4.5 中,您需要pack像这样使用完整路径:

<Image Source="pack://application:,,,/AssemblyName;component/Images/image_to_use.png">
于 2014-02-05T21:21:54.293 回答
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 引用。

于 2014-02-05T19:59:09.357 回答
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" /> 
于 2014-02-05T20:29:25.837 回答