.net WPF菜单项图标尺寸

.net WPF菜单项图标尺寸,.net,wpf,xaml,menu,icons,.net,Wpf,Xaml,Menu,Icons,所以我有一个菜单项(在一个上下文菜单中,如果它真的有区别,不要认为它有区别)。我想使用MenuItem.icon属性在MenuItem中显示图标。下面是执行此操作的XAML代码: <MenuItem Header="MenuItem1"> <MenuItem.Icon> <Image Source="[pathtoimage]"/> </MenuItem.Icon> </MenuItem> 这很有

所以我有一个菜单项(在一个上下文菜单中,如果它真的有区别,不要认为它有区别)。我想使用MenuItem.icon属性在MenuItem中显示图标。下面是执行此操作的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>


基本上,问题是由于MenuItem
标题
,标题类型为
object
,您添加了一个字符串,因此它没有高度/宽度,因此
MenuItem
实际高度
将返回
自动

如果要添加
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
,以便所有图标都以这种方式运行

图标大小和图标区域宽度在菜单项模板和样式中进行硬编码,如下所示

            <ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/>

因此,如果您想要动态图标大小,您需要从其中一个系统主题(例如aero2.normalcolor.xaml)复制与MenuItem相关的所有模板和样式,然后您可以根据需要自定义它们。在您的情况下,需要对这些模板和样式进行大量更改。不幸的是,没有更简单的方法可以做到这一点。而且它也不可伸缩,因为除非您更改所有系统主题,否则您只能使用一个系统主题


在这里的相关主题中也提出了类似的建议:或者。

尝试过,但没有成功。虽然这很有道理。或者我应该多做点什么?ItemContainerTemplate与我的问题有什么关系?我是否也应该使用它来实现我想要的行为?图标大小可能是针对“aero2”Win8/10硬编码的,但不针对Win7“aero”。当开发操作系统时,可以在两种方式中都产生令人惊讶的结果!=用户操作系统。(在W7上开发时,W10上的剪裁图标,或者在W10上开发时,W7上的疯狂大图标看起来都很清晰)。