所以我有一个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中实现这一点,因为我确信在代码隐藏中有很多方法来处理这一点。
发布于 2016-02-11 07:45:25
图标大小和图标区域宽度是在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。
发布于 2013-03-31 12:00:31
基本上,问题是由于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>因此,考虑到这一点,您可以很容易地为MenuItem创建一个ItemContainerTemplate,以便所有对象都以这种方式运行
https://stackoverflow.com/questions/15725729
复制相似问题