我如何让我的WPF scrollviewer与缩放工作?

我如何让我的WPF scrollviewer与缩放工作?

问题描述:

我对我应该如何解决这个问题有某种有意义的误解。我如何让我的WPF scrollviewer与缩放工作?

我有一个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> 

而隐藏代码:

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行,画布会缩小/增大,但同时也会缩放,这意味着与其内容相比,它看起来不正确。

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

我发现this page了答案,在这个文本是关键:

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

在我的情况下,这只是使用正确的LayoutTransform而不是RenderTransform,而且都是好的。

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

修复ScrollViewer的高度和宽度。

+0

不会改变高度和宽度是否会影响ScrollViewer的实际像素大小(屏幕上)?这不是我想要做的。我希望ScrollViewer保持相同的可见尺寸......但是当内容太大时(当人放大到足够远时)显示滚动条。 – Beska 2010-07-26 21:04:49