2

我希望在我的 WPF 应用程序中使用 VS2008ImageLibrary/Actions/pngformat 中的一些图标来获得更多的 Visual Studio 外观 - 就像 WinForms 中的“插入标准项目”命令。
我已将图像添加为资源,并在我的 xaml 文件中引用它们:

<DockPanel.Resources>
        <Image x:Key="NewIcon" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/>
</DockPanel.Resources>

然后我将图像添加到菜单和工具栏

<MenuItem Command="ApplicationCommands.New" Icon="{StaticResource NewIcon}"/>
<!-- ... -->
<Button Command="ApplicationCommands.Save"><StaticResourceExtension ResourceKey="SaveIcon"/></Button>

但是,当我打开菜单时,图标从工具栏中消失,好像按钮从未存在过。我在其他地方读到这种事情是由于 .NET 缺乏对 Vista 图标/压缩 PNG 的支持,但我'不确定这是完全相同的问题。我试图通过改变格式来解决这个问题的尝试失败了,或者给出了次优的结果(例如失去透明度)。有谁知道更好的方法来做到这一点?

编辑:对于遇到此问题的其他人,在 < DockPanel.Resources > 标记中为每个引用使用不同键的重复条目似乎是一种功能足够的解决方法,但我担心如果需要图像可能会再次消失因任何原因被重新加载。

4

2 回答 2

4

我认为您必须为使用 Button 定义一个单独的资源:

    <DockPanel.Resources>
        <Image x:Key="NewIconForMenu" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/>
<Image x:Key="NewIconForButton" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/>
</DockPanel.Resources>

我想,当你声明一个 Image 资源时,它基本上是在创建 Image 类型的对象。之后,您通过设置 Icon 和 Content 属性使其成为 MenuItem 和 Button 的子项,因此它不再是一棵树。这是不合法的。

如果您尝试声明也使用 NewIcon 的第二个按钮,您将获得逻辑树异常。

我不知道 MenuItem 是如何逃脱该异常的,可能在将图像添加到自己的逻辑子集合之前从 Button 的子元素中删除 Image 元素(这就是它消失的方式)是否足够聪明。

好的,我刚刚找到了一个更简单的解决方案。您可以将 x:Shared="false" 添加到字典中的图像声明中。这将确保创建该图像的新实例并且不会破坏 wpf 树规则。

于 2009-04-17T14:38:28.023 回答
1

使用失去透明度的格式并将透明度键设置为该背景颜色。

于 2009-03-26T02:36:13.437 回答