Wpf 在功能区内的控件中获得正确的图像大小

Wpf 在功能区内的控件中获得正确的图像大小,wpf,xaml,ribbon,Wpf,Xaml,Ribbon,我正在使用WPF功能区开发Windows应用程序。在这些功能区上,有带有图像的控件,这些图像由(大/小)ImageSource指定,如本示例所示: <Ribbon> ... <RibbonGroup> <RibbonToggleButton Name="NotExecutedQCButton" Margin="8,0,8,0" Command="{Binding FilterNotExecutedCommand}"

我正在使用WPF功能区开发Windows应用程序。在这些功能区上,有带有图像的控件,这些图像由(大/小)ImageSource指定,如本示例所示:

<Ribbon>
...
<RibbonGroup>
    <RibbonToggleButton Name="NotExecutedQCButton" Margin="8,0,8,0"
            Command="{Binding FilterNotExecutedCommand}"
            IsChecked="{Binding NotExecutedChecked, Mode=TwoWay}"
            LargeImageSource="pack://application:,,,/Sensor.UserControls;component/Icons/icons8.com/qc_notExecuted.png"
            Label="Not Executed"/>
    <RibbonButton Name="AllQCButton" Margin="8,0,8,0"
            Command="{Binding FilterAllCommand}"
            LargeImageSource="pack://application:,,,/Sensor.UserControls;component/Icons/icons8.com/qc_erase.png"
            Label="Remove Filters"/>
</RibbonGroup>
...

...
...
现在,当我在这里使用48x48像素的图像时,它们会显示模糊和扭曲。就像这里:

当我将图像重新缩放到32x32时,它显示得很好。这是因为RibbonImageSize具有一个固定值,可在此处找到:

根据这份文件:

小图像通常为16x16像素,分辨率为96 dpi。大图像通常为32x32像素,分辨率为96 dpi

注意“通常”这个词。进行进一步研究时,该值似乎取决于所用监视器的dpi:

本文档说明我需要提供不同比例的图像版本以支持不同的监视器,如下所示:

<Command.LargeImages>
  <Image Source="res/CutLargeImage32.bmp" Id="116" Symbol="ID_CUT_LARGEIMAGE1" MinDPI="96" />
  <Image Source="res/CutLargeImage40.bmp" Id="117" Symbol="ID_CUT_LARGEIMAGE2" MinDPI="120" />
  <Image Source="res/CutLargeImage48.bmp" Id="118" Symbol="ID_CUT_LARGEIMAGE3" MinDPI="144" />
  <Image Source="res/CutLargeImage64.bmp" Id="119" Symbol="ID_CUT_LARGEIMAGE4" MinDPI="192" />
</Command.LargeImages>

现在,在我的示例中,我应该把这段代码放在哪里?我的代码中没有像示例中那样的命令,RibbonButton或其他Ribbon控件元素没有LargeImages属性

或者更好的是,我如何确定这些16x16或32x32的固定值始终在使用?如果不能,如何为应用程序中的功能区控件提供这些值?现在,我对不同尺寸的显示器不感兴趣,我对每个显示器上的所有图像使用一个硬编码分辨率(一个小,一个大)很好。但现在看来,当我在一台装有不同显示器的机器上运行我的应用程序时,图像可能会变得模糊。即使我设法为所有这四种情况指定图像,它也无法在没有这四个指定DPI值之一的监视器上工作

我只想确保这些图像不会模糊,至少在标准的现代显示器上是这样。我怎样才能做到这一点

或者更好的是,我如何确定这些16x16或32x32的固定值始终在使用

在默认的
ControlTemplate
中查找控件。您可以在位于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF中的
System.Windows.Controls.Ribbon.dll
程序集中找到它

如果您使用工具(如)对其进行反编译,并查看themes文件夹中的模板,您将注意到绑定到
LargeImageSource
属性的
Image
元素具有固定的宽度和重量
32
,并且显示
SmallImageSource
的图像具有固定的宽度和高度
16


如果要显示任何其他大小的图像,您可能需要修改模板。

这是否特定于某些版本的WPF?另外:“对于任何图像,确切的像素大小取决于显示器的显示分辨率,或所用显示器的每英寸点数(dpi)”,所以这是谎言?为什么会有这样的说法?@borismolder:不同版本的Windows的模板可能会有所不同,但我怀疑功能区图像的大小。它们始终为16x16或32x32倾角。但这和像素不完全一样:我不知道倾斜。这是否也意味着WPF应用程序中的所有图像总是被重新缩放,因此,在DPI不接近96的机器上,它们看起来总是失真的?尤其是在低DPI屏幕上?@borismolder:是的,它们被重新缩放。