Как мне заставить мой WPF scrollviewer работать с масштабированием? - PullRequest
6 голосов
/ 27 июля 2010

У меня есть какое-то фундаментальное недопонимание того, как мне следует подходить к этой проблеме.

У меня есть Canvas внутри ScrollViewer.Я хотел бы иметь возможность увеличивать и уменьшать масштаб этого Canvas и настроить ScrollViewer соответствующим образом.

Вот код:

XAML:

<Window x:Class="scrollerProblem.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <ScrollViewer Name="scroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Canvas Background="AntiqueWhite" Name="content" MouseLeftButtonDown="content_MouseLeftButtonDown" MouseRightButtonDown="content_MouseRightButtonDown">
            <Rectangle Width="100" Height="100" Canvas.Top="50" Canvas.Left="50" Fill="PaleGoldenrod"></Rectangle>
        </Canvas>
    </ScrollViewer>
</Window>

Иcodebehind:

using System.Windows;
using System.Windows.Input;
using System.Windows.Media;

namespace scrollerProblem
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        float Zoom = 1;

        public Window1()
        {
            InitializeComponent();
            content.Width = 700;
            content.Height = 700;
        }

        private void content_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            content.Width *= 2;  // BLAH
            content.Height *= 2;  // BLAH
            Zoom *= 2;
            TransformGroup gridTransforms = new TransformGroup();
            gridTransforms.Children.Add(new ScaleTransform(Zoom, Zoom));
            gridTransforms.Children.Add(new TranslateTransform(0, 0));
            content.RenderTransform = gridTransforms;
        }

        private void content_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            content.Width /= 2;  // BLAH
            content.Height /= 2;  // BLAH
            Zoom /= 2;
            TransformGroup gridTransforms = new TransformGroup();
            gridTransforms.Children.Add(new ScaleTransform(Zoom, Zoom));
            gridTransforms.Children.Add(new TranslateTransform(0, 0));
            content.RenderTransform = gridTransforms;
        }
    }
}

Если я пропущу строки, помеченные "BLAH", полосы прокрутки вообще не изменятся ... что не слишком удивительно, поскольку на самом деле ничто не меняет размерсодержание холста.Однако, если я добавлю строки BLAH, холст сжимается / увеличивается, но в то же время он масштабируется, что означает, что он выглядит неправильно по сравнению с его содержимым.

Я предполагаю, что яЯ использую некорректный подход, но я не понимаю, как его решить.Это правильный путь, с небольшой проблемой, или я принимаю совершенно неправильный такт?

Ответы [ 2 ]

4 голосов
/ 27 июля 2010

Я нашел ответ на этой странице , где этот текст был ключевым:

Итак, в чем разница между LayoutTransform и RenderTransform? Два имени свойства раскрывают многое в этом случае. Любое преобразование, назначенное LayoutTransform, применяется при выполнении макета. RenderTransform применяется после макета, когда выполняется рендеринг.

В моем случае это был просто вопрос использования правильного LayoutTransform вместо RenderTransform, и все хорошо.

0 голосов
/ 27 июля 2010

ScrollViewer размещает полосу прокрутки только тогда, когда полоса прокрутки переполняется от максимальной высоты ScrollViewer.

Исправьте высоту и ширину ScrollViewer.

...