ContextMenu图标不显示

时间:2010-11-30 15:30:52

标签: .net wpf user-controls wpf-controls contextmenu

我有一些图像用作ContextMenu项目的图标:

<UserControl.Resources>
    <Image x:Key="DeleteIco" Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" Width="16" Height="16"/>
    ...
    <ContextMenu x:Key="MyMenu1">
        <MenuItem Header="Delete" Icon="{StaticResource DeleteIco}"/>
    </ContextMenu>

    <ContextMenu x:Key="MyMenu2">
        <MenuItem Header="Delete me" Icon="{StaticResource DeleteIco}"/>
    </ContextMenu>
<UserControl.Resources>

有时第一个菜单会错过图标,有时第二个菜单会错过...为什么?我没有对代码中的图标做任何事情。

2 个答案:

答案 0 :(得分:2)

您已创建Image控件,并尝试将其两次放入可视树中。由于所有控件只能有一个父级Image已断开连接。因此,第二次使用它时,第一次将断开连接,导致您丢失图标。

您可以解决此问题,方法是不添加Image,而是将ImageSource添加到您的资源中:

<BitmapImage x:Key="DeleteIco" UriSource="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" />

您的菜单必须稍微更改一下才能正常工作:

<ContextMenu x:Key="MyMenu1">
    <MenuItem Header="Delete">
         <MenuItem.Icon>
              <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
         </MenuItem.Icon>
    </MenuItem>
</ContextMenu>

<ContextMenu x:Key="MyMenu2">
    <MenuItem Header="Delete me">
         <MenuItem.Icon>
              <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
         </MenuItem.Icon>
    </MenuItem>
</ContextMenu>

<强>更新

您还可以使用样式为您设置Image的一些基本属性

<Style TargetType="Image">
    <Setter Property="Width" Value="16"/>
    <Setter Property="Width" Value="16"/>
</Style>

或者使用MenuItem的样式每次设置Icon

<Style TargetType="MenuItem" x:Key="DeleteMenuIcon">
    <Setter Property="Icon">
        <Setter.Value>
             <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
        </Setter.Value>
    </Setter>
</Style>

菜单项:

<MenuItem Header="Delete me" Style="{StaticResource DeleteMenuIcon}" />

答案 1 :(得分:1)

我有同样的问题,但标记的解决方案并没有为我解决。 做了解决问题的方法是在Image资源上设置x:Shared="False"

<Image x:Key="DeleteIco" 
       x:Shared="False"
       Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico"
       Width="16" Height="16"/>

正如@Arcturus正确提到的那样,您当前正在为多个控件设置与子控件相同的图像控件,这会导致它每次都与前一个控件分离,然后仅为最后一个控件设置。设置x:Shared="False"将导致每次请求资源时都创建一个新的Image控件,从而解决问题。

需要注意的一点是x:Shared属性无法在任何地方设置,因此请确保在实际适用的地方使用它(来自上文):

  

在WPF中,x:Shared仅在以下条件下有效:

     
      
  • 包含x:Shared项目的ResourceDictionary必须是   编译。 ResourceDictionary不能在松散的XAML中使用或使用   主题。

  •   
  • 包含项目的ResourceDictionary不得为   嵌套在另一个ResourceDictionary中。例如,你不能使用   x:在StyleDictionary中的一个Style内共享   已经是ResourceDictionary项目。

  •