2009-11-27 108 views
2

在WPF中,我有一种曲线编辑器,它由一个画布顶部的滚动查看器(用于平移),其中显示关键点和曲线段(线性,常量和样条曲线)。我正在使用MVVM。另外,我可能有数百个按键,其间有段。另外,平移/缩放必须非常平滑和响应。WPF缩放问题

在模型(和ViewModel)中,一个键有XY位置;细分市场有PointCollection。 在视图中,键是Rectangle,曲线段是Polyline。 所有这些UI元素都绑定到Canvas的Top和Left依赖项属性。

我遇到的问题是执行缩放时。 我第一次与插入的ScrollViewer和帆布

<ScrollViewer> 
    <Viewbox> 
     <Canvas/> 
    </Viewbox> 
</ScrollViewer> 

平移工作的罚款之间的视框中的工作,但变焦是不是我想要的右变焦。它做了一个“图形”缩放,这使得一切更大,矩形和多段线。

我想要的是,当放大时,键(矩形)彼此之间更远,没有变大,并且段(折线)在两个键之间延伸,没有看到更大的StrokeThickness

我想要的解决方案是在更改缩放时将VM中的所有坐标转换为VM。

例如: 该模型中的关键字的位置为(2,3)。当缩放值为2.0时,键的ViewModel将显示(4,6)的位置。对于片段,我将翻译模型的PointCollection中的所有点,并将它们放入ViewModel的PointCollection中。

该解决方案的问题在于,当我拥有数百个密钥时,在放大/缩小时性能可能会变慢。由于改变缩放因子将改变ViewModels坐标,因此每个UIElements都会移动。

我想过UIElements上的RenderTransform来应用缩放转换,但它不适用于多义线。我可以对多段线使用ScaleTransform,但这样可以直观地展开它们。

描述起来相当复杂,所以请随时索取更多细节。

关于如何实现这一点的任何想法?

回答

0

我已经做了一些非常类似于你想要的东西。不幸的是,我不认为你会通过使用ViewBox甚至ScaleTransform来获得你想要的。

您可能想要考虑创建自己的实现IScrollInfo的Panel,以便您可以自己处理Arrange。

希望这会有所帮助。