2013-03-31 127 views
1

所以我有一个MenuItem(在ContextMenu中,如果它确实有所作为,不要认为它是)。我想使用MenuItem.Icon属性在MenuItem中显示一个图标。这是XAML代码:WPF MenuItem.Icon尺寸

<MenuItem Header="MenuItem1"> 
    <MenuItem.Icon> 
     <Image Source="[pathtoimage]"/> 
    </MenuItem.Icon> 
</MenuItem> 

This works。但是如果我想用高度和宽度指定图标的大小呢?在网上搜索显示,它应该是32,有人说应该是20. 20对我最好,但我不想硬编码20.我想设置它与MenuItem相同的高度,给定的事实上,在不同的分辨率下,实际高度可能不同。所以,我尝试了以下内容:

<MenuItem x:Name="menuItem1" Header="MenuItem1"> 
    <MenuItem.Icon> 
     <Image Source="[pathtoimage]" 
       Height="{Binding Path=ActualHeight, ElementName=menuItem1}" 
       Width="{Binding Path=ActualHeight, ElementName=menuItem1}" 
    </MenuItem.Icon> 
</MenuItem> 

你会认为它应该工作,但它没有。问题是为什么?如果我将宽度和高度均设置为20,则能够获得所需的外观。但是,如果系统字体大小发生变化,那么20x20将不再理想。在XAML中这样做是理想的,因为我相信在代码隐藏方面有很多方法可以处理这个问题。

回答

1

图标大小和图标区域宽度内的菜单项模板和样式类似下面的硬编码。

  <ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/> 

所以,如果你想你需要复制所有从SystemThemes之一(例如aero2.normalcolor.xaml)相关的菜单项的模板和样式,然后您可以自定义他们为你的需求动态图标的大小。在你的情况下,它需要在这些模板和样式中进行大量的更改。不幸的是,没有更简单的方法来做到这一点。而且它不是可扩展的,因为除非您更改所有这些主题,否则您只会停留在一个系统主题中。

在这里相关的主题中提到了类似的东西:WPF - How to style the menu control to remove the left margin?System.Windows.Controls.MenuItem without icon area

+0

图标大小可能会针对“aero2”Win8/10进行硬编码,但不适用于Win7“aero”。在开发OS!=用户操作系统时,可以以两种方式给出令人惊讶的结果。 (在W7上开发W10上的剪辑图标,或W7上的W7上的疯狂大图标都显得清脆)。 – springy76

0

嗯,基本上这个问题是由于菜单项Header,标题是object型和添加一个字符串,所以它没有高度/宽度,所以MenuItemActualHeight将返回Auto

如果您要添加一个Textblock作为标题这将给MenuItem一个高度,可用于设置您的图像大小。

<MenuItem x:Name="menuItem1" > 
    <MenuItem.Header> 
     <TextBlock Text="MenuItem1" /> 
    </MenuItem.Header> 
    <MenuItem.Icon> 
     <Image Height="{Binding Header.ActualHeight, ElementName=menuItem1}" 
       Width="{Binding Header.ActualHeight, ElementName=menuItem1}" /> 
    </MenuItem.Icon> 
</MenuItem> 

所以考虑到这一点,你可以很容易地使一个ItemContainerTemplateMenuItem所以在这种方式中的所有行为

+0

尝试过,但没有奏效。尽管它很有意义。或者,也许我应该做更多的事情? ItemContainerTemplate如何处理我的问题?我是否也应该使用它来实现我想要的行为? – armanali