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

Get the image size right in Controls inside a Ribbon

我正在使用 WPF 功能区开发 Windows 应用程序。在这些功能区上,有带图像的控件,由 (Large/Small)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 有一个固定值,可以在这里找到:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.ribbon.ribbonimagesize?view=netframework-4.8#System_Windows_Controls_Ribbon_RibbonImageSize_Large

根据这个文档:

A Small image is typically 16x16 pixels at 96 dpi. A Large image is typically 32x32 pixels at 96 dpi.

注意 "typically" 这个词。在做进一步研究时,这个值似乎取决于所用显示器的 dpi:

https://docs.microsoft.com/en-us/windows/desktop/windowsribbon/windowsribbon-imageformats

本文档指出我需要提供不同缩放版本的图像以支持不同的显示器,如下所示:

<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 或其他功能区控件元素没有 LargeImages 属性.

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

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

Or better, how can I know for sure these fixed values of 16x16 or 32x32 are always being used?

在控件的默认 ControlTemplate 中查找。您会在位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF.

System.Windows.Controls.Ribbon.dll 程序集中找到它

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

如果您打算显示任何其他尺寸的图像,您可能需要修改模板。