【发布时间】:2011-07-12 09:01:06
【问题描述】:
我想知道是否有人可以指导我解决这个问题:
我需要通过单击画布上的几个点来创建路径,这些点将被添加到路径几何图形中。完成路径后,用户可以“滑动”或移动路径的控制顶点(锚点)来调整路径的形状。
我已经想出了如何绘制“套索”样式的路径,但是我如何允许用户选择和移动路径中的单个点???
【问题讨论】:
我想知道是否有人可以指导我解决这个问题:
我需要通过单击画布上的几个点来创建路径,这些点将被添加到路径几何图形中。完成路径后,用户可以“滑动”或移动路径的控制顶点(锚点)来调整路径的形状。
我已经想出了如何绘制“套索”样式的路径,但是我如何允许用户选择和移动路径中的单个点???
【问题讨论】:
您必须开发一种数据结构来存储点数据,以便可以轻松查询和操作。 Path 对象本身可能就足够了,但请考虑将其包装在另一个对象中以呈现更特定于域的接口。
您必须在画布中检测鼠标事件,并对路径中的所有顶点进行命中测试。
点击测试是一个函数,它为您提供对最接近鼠标坐标的路径中的单个点的引用,如果点击距离任何点太远而不能被视为“点击”,则为 null .您的命中测试函数变成了一个低级构造,您可以从中构建更有趣的编辑操作。
例如,您可以为路径中的每个点存储一个bool,以指示该点是否被选中。当您按下按钮拖动鼠标时,您可以通过在前面提到的数据结构中偏移它们的数据来拖动所有选定的点。
【讨论】:
我会尝试以下方法:
ObservableCollection<Point>,或者可能是一个 PointCollection。System.Windows.Controls.Primitives.Thumb(处理拖动的控件),并使用具有 Ellipse 和 DataTrigger 形状的 ControlTemplate 根据被选中更改其外观或不。 ItemsSource 也将绑定到集合。这样做,您将对路径进行命中测试,例如,突出显示其点,这将打开 ItemsContainer 的可见性(从而进行命中测试)。
通过这些,您可以使用常规事件,如“Drag”、“MouseMove”等,直接处理命中测试。
【讨论】: