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

时间:2010-11-29 11:45:37

标签: 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>

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

我尝试删除第二项,

<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>

然后我得到了像

这样的东西

如何重复使用图标?

3 个答案:

答案 0 :(得分:8)

请参阅this问题

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

<Window.Resources>
    <Image x:Key="CopyIcon" x:Shared="False" Source="..." />
</Window.Resources>

来自msdn

  

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

答案 1 :(得分:4)

您最有可能在资源中将 CopyIcon 声明为图像类型,如下所示:

<Window.Resources>
  <Image x:Key="CopyIcon" Source="yourcopyicon.ico"/>
</Window.Resources>

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

希望这个解释对你有所帮助。现在按照 Meleak 在回复中所说的内容进行操作。 : - )

答案 2 :(得分:1)

尝试以下方法:

<MenuItem Header=“Paste“ >
<MenuItem.Icon><Image Height=“16“ Width=“16“ Source=“paste.jpg“ /></MenuItem.Icon>
</MenuItem>