【问题标题】:Disappearing icons in WPFWPF中的图标消失
【发布时间】:2010-10-15 14:54:20
【问题描述】:

我希望在我的 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 的支持,会发生这种情况,但我不确定这是完全相同的问题。我试图通过改变格式来解决这个问题的尝试失败了,或者给出了次优的结果(例如失去透明度)。 有谁知道更好的方法吗?

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

【问题讨论】:

    标签: wpf resources png


    【解决方案1】:

    我认为您必须定义一个单独的资源以供 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 树规则。

    【讨论】:

    • 啊,这很有道理。 x:Shared="false" 正是我正在寻找的那种解决方案。非常感谢。
    【解决方案2】:

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

    【讨论】:

    • 使用不透明格式的问题是我失去了图像的抗锯齿功能。此外,这需要修改所有图标以确保背景与调色板中的任何其他颜色都不匹配。它可能会起作用,但我真的希望有一个更优雅的解决方案。
    • 是的,如果您只是想制作一个蛮力应用程序,这个解决方案很好,但由于这不是您想要的,并且到目前为止您还没有得到任何答案,所以我会提供赏金。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多