WPF MenuItem.Icon尺寸(WPF MenuItem.Icon dimensions)

2019-10-17 22:44发布

所以我有一个菜单项(一个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,因为我相信有很多的代码隐藏处理这种方式。

Answer 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 -如何风格菜单控制,除去左边距? 或System.Windows.Controls.MenuItem无图标区域 。



Answer 2:

嗯,基本上这个问题是由于菜单项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>

因此,考虑到这一点,你可以很容易地使一个ItemContainerTemplateMenuItem ,从而以这种方式表现的所有



文章来源: WPF MenuItem.Icon dimensions