2010-11-30 78 views
0

我有一些图片,我作为图标使用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

您已经创建了一个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> 

更新:

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

<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}" /> 
+0

似乎是明确的......所以,任何方式不重复 ... WIDTH = “16” HEIGHT = “16” 的节点? – serhio 2010-11-30 15:49:56

+0

样式..使用样式为你设置图标..让我更新我的答案;) – Arcturus 2010-11-30 15:52:42

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:共享才有效在以下条件下:

  • 包含与x中的项目的的ResourceDictionary:共享必须是 编译。 ResourceDictionary不能位于宽松的XAML中或用于主题 。

  • 包含项目的ResourceDictionary不得嵌套在另一个ResourceDictionary中的 。例如,不能使用 x:ResourceDictionary中项目的共享位于 已经是ResourceDictionary项目的样式中。