所以我有一个菜单项(一个ContextMenu内,如果它真的有差别,不认为它)。 我想用MenuItem.Icon属性显示菜单项中的图标。 下面是执行此XAML代码:
<MenuItem Header="MenuItem1">
<MenuItem.Icon>
<Image Source="[pathtoimage]"/>
</MenuItem.Icon>
</MenuItem>
这工作。 但是,如果我想要做什么用高度和宽度指定图标的大小? 在网络上搜索发现,它应该是32,有人说应该是20。20件作品最适合我的,但我不想硬编码20.我想将它设置为相同的高度菜单项,考虑到事实是在不同分辨率的实际高度可能会有所不同。 所以,我试过如下:
<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。但是,如果系统字体大小被改变,那么20×20会不理想了。 这将是理想的做到这一点的XAML,因为我相信有很多的代码隐藏处理这种方式。
图标大小和图标区域宽度内的菜单项模板和样式类似下面的硬编码。
<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 -如何风格菜单控制,除去左边距? 或System.Windows.Controls.MenuItem无图标区域 。
嗯,基本上这个问题是由于菜单项Header
,标题是类型的object
,你添加一个字符串所以它没有高度/宽度,这样的MenuItem
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
的MenuItem
,从而以这种方式表现的所有