首页 文章

WPF缩放问题

提问于
浏览
2

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

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

我遇到的问题是实现缩放 . 我首先使用插入在scrollviewer和canvas之间的视图框

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

平移工作正常,但缩放不是我想要的缩放 . 它进行了“图形化”缩放,使一切变大,矩形和折线 .

我想要的是,当放大时,键(矩形)在彼此之间变得更远,而不会变大,并且段(折线)在两个键之间伸展,而 StrokeThickness 看起来更大 .

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

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

该解决方案的问题在于,当我有数百个密钥时,在放大/缩小时可能会降低性能 . 由于更改缩放系数将改变所有ViewModels坐标,因此每个UIElements都将被移动 .

我想到了UIElements上的RenderTransform来应用缩放转换,但它不适用于Polylines . 我可以使用ScaleTransform作为折线,但这会在视觉上拉伸它们 .

描述起来相当复杂,所以请随时询问更多细节 .

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

1 回答

  • 0

    我做了一些与你想要的东西非常相似的东西 . 不幸的是,我不认为你会通过使用ViewBox甚至ScaleTransform获得你想要的东西 .

    您可能希望创建自己的实现IScrollInfo的Panel,以便您可以自己处理Arrange .

    希望这可以帮助 .

相关问题