所以我有一个MenuItem(在ContextMenu中,如果它确实有所作为,不要认为它确实如此)。我想使用MenuItem.Icon属性在MenuItem中显示一个图标。这是执行此操作的XAML代码:
<MenuItem Header="MenuItem1">
<MenuItem.Icon>
<Image Source="[pathtoimage]"/>
</MenuItem.Icon>
</MenuItem>
这很有效。但是如果我想用高度和宽度指定图标的大小呢?在网上搜索显示它应该是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中这样做是理想的,因为我确信在代码隐藏中有很多方法可以解决这个问题。
答案 0 :(得分:1)
图标大小和图标区域宽度在MenuItem模板和样式中进行了硬编码,如下所示。
<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)复制与MenuItem相关的所有模板和样式,然后您可以根据需要自定义它们。在您的情况下,这些模板和样式需要进行大量更改。不幸的是,没有更简单的方法可以做到这一点。并且它不可扩展,因为除非你改变所有系统主题,否则你只会坚持使用一个系统主题。
此处的相关主题中提出了类似的建议:WPF - How to style the menu control to remove the left margin?或System.Windows.Controls.MenuItem without icon area。
答案 1 :(得分:0)
基本上问题是由于MenuItem Header
,Header的类型为object
,你添加一个字符串使其没有高度/宽度,所以MenuItem
{{ 1}}将返回ActualHeight
如果您要添加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>
制作ItemContainerTemplate
,以便所有人都以这种方式行事