Какие события мне нужны при масштабировании подкласса элемента управления WPF Image в средстве просмотра прокрутки?

Я создал подкласс элемента управления изображением (для отображения изображений с их истинным размером в пикселях, независимо от настройки разрешения в метаданных), и я хочу реализовать прокрутку и масштабирование с помощью ScaleTransform (внутри LayoutTransform). Это отлично работает на 100%, но при масштабировании размер прокрутки остается равным размеру изображения 100%.

Мой XAML:

<ScrollViewer Name="imgScrollViewer" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    <PL:DpiAgnosticImage x:Name="Ctrl_ImgMain" Stretch="None" HorizontalAlignment="Left" MouseWheel="Ctrl_ImgMain_MouseWheel" VerticalAlignment="Top"   >
         <Image.LayoutTransform>
              <ScaleTransform ScaleX="{Binding ZoomLevel}" ScaleY="{Binding ZoomLevel}">
              </ScaleTransform>
         </Image.LayoutTransform>
    </PL:DpiAgnosticImage>
</ScrollViewer>

С# для моего класса DpiAgnosticImage:

class DpiAgnosticImage : Image
{
    protected override Size MeasureOverride(Size constraint)
    {
        var bitmapImage = Source as BitmapImage;

        var desiredSize = bitmapImage == null
            ? base.MeasureOverride(constraint)
            : new Size(bitmapImage.PixelWidth, bitmapImage.PixelHeight);

        return desiredSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        return new Size(Math.Round(DesiredSize.Width), Math.Round(DesiredSize.Height));
    }
}

Я искал вокруг, но самое близкое, что я нашел для этой проблемы, предполагает использование LayoutTransform, которым я уже являюсь. Я подозреваю, что мне нужно что-то реализовать, чтобы изменить размер прокрутки при масштабировании изображения, но я изо всех сил пытаюсь выяснить, что требуется. Мы ценим любые предложения.


person Andy McDonald    schedule 13.03.2012    source источник


Ответы (1)


Ваш производный элемент управления изображением работает нормально, если вы просто не переопределяете ArrangeOverride.

По-видимому, свойство DesiredSize получает размер, рассчитанный MeasureOverride и впоследствии преобразованный LayoutTransform. Это может быть очевидно во время компоновки, хотя, похоже, это не очень хорошо задокументировано в MSDN Желаемый размер и Переопределение меры.

Нашел это у Чарльза Петцольда, «Приложения = Код + Разметка», стр. 831:

Свойство DesiredSize дочернего элемента отражает LayoutTransform,...

В любом случае, если вам нужно переопределить ArrangeOverride по любой другой причине, просто верните значение аргумента finalSize.

person Clemens    schedule 13.03.2012
comment
Спасибо, именно в этом и была проблема - person Andy McDonald; 13.03.2012