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

问题描述 投票:0回答:1

我正在使用WPF Ribbons处理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像素图像时,它们会显得模糊和扭曲。就像这里一样:

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

根据这个文件:

小图像通常在96 dpi时为16x16像素。大图像通常在96 dpi时为32x32像素。

注意“通常”这个词。在进行进一步研究时,此值似乎取决于所使用的监视器的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>

现在我在哪里将此代码放在我的示例中?我的代码中没有像示例中那样的Command,而RibbonButton或其他Ribbon控件元素没有LargeImages属性。

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

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

wpf xaml ribbon
1个回答
1
投票

或者更好的是,我怎么能确切地知道这些16x16或32x32的固定值是否总是被使用?

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.