2

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

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

我遇到的问题是在实现缩放时。我首先使用了一个插入在滚动查看器和画布之间的视图框

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

平移工作正常,但缩放不是我想要的正确缩放。它进行了“图形”缩放,使矩形和折线变得更大。

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

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

例如:模型中的键的位置为 (2,3)。当缩放值为 2.0 时,键的 ViewModel 将显示 (4,6) 的位置。对于Segment,我会翻译Model的PointCollection中的所有Points,并将它们放到ViewModel的PointCollection中。

该解决方案的问题在于,当我拥有数百个键时,它可能会在快速放大/缩小时降低性能。由于更改缩放因子将更改所有 ViewModels 坐标,因此每个 UIElements 都会被移动。

我考虑过 UIElements 上的 RenderTransform 来应用缩放平移,但它不适用于折线。我可以对折线使用 ScaleTransform,但这会在视觉上拉伸它们。

描述起来很复杂,所以请随时询问更多细节。

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

4

1 回答 1

0

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

您可能希望考虑创建自己的实现 IScrollInfo 的面板,以便您可以自己处理 Arrange。

希望这可以帮助。

于 2009-11-29T03:36:00.640 回答