Какие события мне нужны, когда я масштабирую элемент управления WPF подклассами внутри прокрутки просмотра? - PullRequest
0 голосов
/ 13 марта 2012

Я разделил элемент управления изображениями на подклассы (для отображения изображений с их истинным размером пикселя, независимо от настройки разрешения в метаданных), и я хочу реализовать прокрутку и масштабирование, используя 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>

C # для моего класса 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, которым я уже являюсь.Я подозреваю, что мне нужно реализовать что-то, чтобы изменить размер прокрутки при масштабировании изображения, но я изо всех сил пытаюсь выяснить, что требуется.Любые предложения будут оценены.

1 Ответ

0 голосов
/ 13 марта 2012

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

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

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

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

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

...