【问题标题】:Get the image size right in Controls inside a Ribbon在功能区内的控件中正确获取图像大小
【发布时间】:2019-04-26 13:28:39
【问题描述】:

我正在使用 WPF Ribbons 开发一个 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 像素的图像时,它们会显得模糊且失真。就像这里:

Images do not render correctly in WPF ribbon control

当我将图像重新缩放为 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

根据这个文档:

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

注意“通常”这个词。在做一些进一步的研究时,这个值似乎取决于正在使用的显示器的 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 或其他 Ribbon 控件元素没有 LargeImages 属性。

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

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

【问题讨论】:

    标签: wpf xaml ribbon


    【解决方案1】:

    或者更好的是,我怎样才能确定这些 16x16 或 32x32 的固定值始终被使用?

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

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

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

    【讨论】:

    • 这是否特定于特定版本的 WPF?另外:“对于任何图像,确切的像素大小取决于正在使用的显示器的显示分辨率或每英寸点数 (dpi)。”所以这是谎言?为什么这么说?
    • @BorisMulder:不同版本的 Windows 之间的模板可能不同,但我怀疑功能区图像的大小。它们总是 16x16 或 32x32 DIP。不过,这与像素并不完全相同:wpf.2000things.com/2013/02/19/759-device-independent-units-dips
    • 我不知道 DIP。这是否也意味着 WPF 应用程序中的所有图像总是重新缩放,因此在 DPI 不接近 96 的机器上总是看起来失真?尤其是在低 DPI 屏幕上?
    • @BorisMulder:是的,它们已重新缩放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多