WPF缩放画布并保持滚动位置

9

我有一个Canvas元素,包含在ScrollViewer中,我正在使用ScaleTransform进行缩放。然而,我希望能够在缩放操作完成后保持查看器的滚动位置集中在画布的同一部分。当前,当我缩放画布时,查看器的滚动位置保持不变,用户正在查看的位置会丢失。

我仍在学习WPF,并且在这方面来回摆动了一段时间,但我无法找出一种漂亮的基于XAML实现我想要的方式。

这是我正在使用的代码的样例...

<Grid>
    <ScrollViewer Name="TrackScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Canvas Width="2560" Height="2560" Name="TrackCanvas">
            <Canvas.LayoutTransform>
                <ScaleTransform ScaleX="{Binding ElementName=ZoomSlider, Path=Value}" 
                                ScaleY="{Binding ElementName=ZoomSlider, Path=Value}"/>
            </Canvas.LayoutTransform>

            <!-- Some complex geometry describing a motor racing circuit -->

        </Canvas>
    </ScrollViewer>
    <StackPanel Orientation="Horizontal" Margin="8" VerticalAlignment="Top" HorizontalAlignment="Left">
        <Slider Name="ZoomSlider" Width="80" Minimum="0.1" Maximum="10" Value="1"/>
        <TextBlock Margin="4,0,0,0" VerticalAlignment="Center" Text="{Binding ElementName=ZoomSlider, Path=Value, StringFormat=F1}"/>
    </StackPanel>
</Grid>
1个回答

3

这不是纯粹的XAML方法,但Joeyw博客上有一篇非常好的文章,标题为WPF中的Pan and Zoom(DeepZoom风格),其中包含源代码链接。他从DeepZoom汲取了灵感,使您能够平滑/动画地平移和缩放内容。如果您使用的是WPF 4,则可以对其进行一些修改,以添加一些缓动函数到动画中,使其更加流畅。


以上链接提供了很多细节,但是下载已经移动到这个页面的链接:http://blogs.windowsclient.net/joeyw/archive/2009/06/02/pan-and-zoom-updated.aspx - Drew Noakes
2
我对这个很感兴趣,但是这两个链接都失效了。不过我在 CodeProject 上找到了一篇文章(http://www.codeproject.com/KB/WPF/DeepZoom.aspx)。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接