使用样式设置MenuItem的图标时,只有最后一项显示图标

时间:2015-12-29 15:40:21

标签: wpf contextmenu

我正在尝试使用Style为ContextMenu中的所有MenuItem设置Icon

<Grid>
<Button Content="Open Context Menu">
   <Button.ContextMenu>
    <ContextMenu>
     <ContextMenu.Resources>               
          <Style TargetType="MenuItem">
              <Setter Property="Header" Value="Click Me"/>                                    
              <Setter Property="Icon">
                  <Setter.Value>
                      <Ellipse Width="16" Height="16" Fill="Red"/>
                  </Setter.Value>
              </Setter>
          </Style>
      </ContextMenu.Resources>        
    <MenuItem/>
    <MenuItem/>
    </ContextMenu>
   </Button.ContextMenu>
</Button>

因此,只有ContextMenu中的最后一个MenuItem会获得一个Ellipse图标

enter image description here

如果我为每个MenuIcon手动设置Icon,我会得到预期的结果:

<Grid>
<Button Content="Open Context Menu">
   <Button.ContextMenu>
    <ContextMenu>
     <ContextMenu.Resources>               
          <Style TargetType="MenuItem">
              <Setter Property="Header" Value="Click Me"/>                                    
          </Style>
      </ContextMenu.Resources>        
      <MenuItem>
        <MenuItem.Icon>
          <Ellipse Width="16" Height="16" Fill="Red"/>
        </MenuItem.Icon>
      </MenuItem>
      <MenuItem>
       <MenuItem.Icon>
          <Ellipse Width="16" Height="16" Fill="Red"/>
       </MenuItem.Icon>
      </MenuItem>
      </ContextMenu>
   </Button.ContextMenu>
</Button>

enter image description here

知道可能导致此行为的原因以及解决方法吗?

我知道有一个类似的问题here,但它没有直接解决我的问题。

更新:我在similar question找到了解决方案。

关键是使用x:Shared="false"

<Grid>
<Button Content="Open Context Menu">
   <Button.ContextMenu>
    <ContextMenu>
     <ContextMenu.Resources>               
      <Ellipse x:Key="MenuIcon" x:Shared="false" 
               Width="16" Height="16" Fill="Red"/>
        <Style TargetType="MenuItem">
              <Setter Property="Header" Value="Click Me"/>                                    
              <Setter Property="Icon" Value="{StaticResource MenuIcon"/>                                      
          </Style>
      </ContextMenu.Resources>                  
      <MenuItem/>
      <MenuItem/>          
      </ContextMenu>
   </Button.ContextMenu>
</Button>

我错误地认为它不起作用/适用于我的情况
因为我在KaXaml进行测试,但不支持此功能。

1 个答案:

答案 0 :(得分:2)

尝试添加

X:共享=&#34;假&#34;

(请注意,它在VS中有效但在Kaxaml中无效:p)