为什么我不能在菜单中为同一个项目使用相同的图标?

Jie*_*eng 3 wpf menu

我有一个MenuItem像下面

<MenuItem Header="Edit">
    <MenuItem Header="Copy Direct Link" Icon="{StaticResource CopyIcon}" Command="{Binding CopyImageCommand}" />
    <MenuItem Header="Copy Image Data" Icon="{StaticResource CopyIcon}" Command="{Binding CopyImageDataCommand}" />
    <MenuItem Header="Paste" Icon="{StaticResource PasteIcon}" Command="{Binding PasteImageCommand}" />
</MenuItem>
Run Code Online (Sandbox Code Playgroud)

注意前两个项目使用相同的图标,我得到类似下面的内容

我尝试删除第二项,

<MenuItem Header="Edit">
    <MenuItem Header="Copy Direct Link" InputGestureText="Ctrl+C" Icon="{StaticResource CopyIcon}" Command="{Binding CopyImageCommand}" />
    <!--<MenuItem Header="Copy Image Data" InputGestureText="Ctrl+Alt+C" Icon="{StaticResource CopyIcon}" Command="{Binding CopyImageDataCommand}" />-->
    <MenuItem Header="Paste" InputGestureText="Ctrl+P" Icon="{StaticResource PasteIcon}" Command="{Binding PasteImageCommand}" />
</MenuItem>
Run Code Online (Sandbox Code Playgroud)

然后我得到了类似的东西

我该如何重用图标?

Fre*_*lad 8

看到这个问题

图像只能有一个父级,因此它将从第一个MenuItem移动到第二个MenuItem.您可以像这样添加x:Shared属性

<Window.Resources>
    <Image x:Key="CopyIcon" x:Shared="False" Source="..." />
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

来自msdn

x:共享属性
设置为false时,修改WPF资源检索行为,以便对属性资源的请求为每个请求创建新实例,而不是为所有请求共享同一实例.


Naw*_*waz 5

您很可能在资源中将CopyIcon声明为 Image 类型,如下所示:

<Window.Resources>
  <Image x:Key="CopyIcon" Source="yourcopyicon.ico"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

所以,问题的根本原因是,Image是一种视觉元素,因为它派生自FrameworkElement(它是一种视觉元素),而视觉元素不能同时拥有多个父元素。这就是为什么第一个 MenuItem 不显示图标,因为第二个 MenuItem重置了 CopyIcon 的父级,使其成为 CopyIcon 的父级。

希望这个解释对您有所帮助。现在请听听梅莱克在回应中所说的话。:-)