Получите размер изображения прямо в элементах управления внутри ленты - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю над приложением Windows, используя ленты WPF. На этих лентах есть элементы управления с изображениями, которые определяются (Большой / Маленький) 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 пикселей, они выглядят размытыми и искаженными. Прямо как здесь:

Изображения отображаются неправильно в элементе управления ленты WPF

Когда я масштабирую изображения до 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 используемого монитора:

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.

Все, что я хочу, это убедиться, что эти изображения не размыты, по крайней мере, на стандартных современных мониторах. Как мне этого добиться?

1 Ответ

1 голос
/ 26 апреля 2019

Или лучше, как я могу точно знать, что эти фиксированные значения 16x16 или 32x32 всегда используются?

Найдите элемент управления по умолчанию ControlTemplate.Вы найдете его в сборке System.Windows.Controls.Ribbon.dll, которая находится в C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ WPF.

Если вы декомпилируете его с помощью такого инструмента, как dokPeek и посмотрите на шаблоны в папке тем, вы заметите, что элементы Image, которые привязываются к свойству LargeImageSource, имеют фиксированную ширину и вес 32 и что изображения, отображающие SmallImageSource имеет фиксированный виджет и высоту 16.

Возможно, вы захотите изменить шаблоны, если вы собираетесь отображать изображения любых других размеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...