WPF MenuItem.Icon维度

时间:2013-03-31 02:26:43

标签: .net wpf xaml menu icons

所以我有一个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中这样做是理想的,因为我确信在代码隐藏中有很多方法可以解决这个问题。

2 个答案:

答案 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,以便所有人都以这种方式行事