如何让我的WPF滚动查看器与缩放一起工作?

时间:2010-07-26 20:51:54

标签: wpf-controls

我对如何解决这个问题有一些基本的误解。

我在ScrollViewer中有一个Canvas。我希望能够放大和缩小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>

代码隐藏:

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”的行,则滚动条根本不会调整......这并不太令人惊讶,因为实际上没有任何内容正在改变内容Canvas的大小。但是,如果我添加BLAH线,画布会缩小/增长,但它也会同时缩放,这意味着它与内容相比看起来不正确。

我猜我采取的是一种有趣的错误方法,但我不清楚如何解决它。这是正确的方法,只是一个小问题,还是我在这里采取完全错误的机智?

2 个答案:

答案 0 :(得分:4)

我在this page找到了答案,其中这个文字是关键:

  

那么,LayoutTransform和RenderTransform有什么区别?在这种情况下,这两个属性名称显示了很多。执行布局时,将应用分配给LayoutTransform的任何Transform。渲染完成后,在布局后应用RenderTransform。

就我而言,只需使用正确的LayoutTransform而不是RenderTransform,一切都很好。

答案 1 :(得分:-2)

仅当滚动条从ScrollViewer的最大高度溢出时,ScrollViewer才会放置滚动条。

修复ScrollViewer的高度和宽度。