我正在制作一个WPF应用程序,让用户可以绘制和调整形状大小。
调整大小部分是使用装饰器完成的,形状是我自己的派生自Shape
的类。
例如,我有一个Polyline
,对于每个点,我在其Thumb
事件上装饰DragDelta
处理程序:
void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
PolylineEx polyline = this.AdornedElement as PolylineEx;
ResizingThumb thumb = sender as ResizingThumb;
int index = (int)thumb.Tag;
Point newPoint = new Point(
polyline.Points[index].X + e.HorizontalChange,
polyline.Points[index].Y + e.VerticalChange);
Trace.WriteLine(String.Format("Arranging point {0}:{1},{2}", index, newPoint.X, newPoint.Y));
polyline.Points[index] = newPoint;
}
void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
PolylineEx polyline = this.AdornedElement as PolylineEx;
ResizingThumb thumb = sender as ResizingThumb;
int index = (int)thumb.Tag;
Point newPoint = new Point(
polyline.Points[index].X + e.HorizontalChange,
polyline.Points[index].Y + e.VerticalChange);
Trace.WriteLine(String.Format("Arranging point {0}:{1},{2}", index, newPoint.X, newPoint.Y));
polyline.Points[index] = newPoint;
}
嗯,问题是,有时(经常),拖动拇指根本不光滑。首先我认为这是一个性能问题,因为每次都会创建一个新的(和其他东西),但后来我注意到有时候这个点设置在与位置无关的奇怪坐标上鼠标。
我还上传了一个示例项目HERE,知道wpf的人可以看看并告诉我发生了什么吗?
此外,如果有人想到更好的方法,那么任何反馈都会受到高度赞赏。
谢谢。
编辑:HERE是项目文件的新链接。
答案 0 :(得分:0)
我最终回答了我自己的问题:)
我认为问题出在这里:
protected override System.Windows.Media.Geometry DefiningGeometry
{
get
{
StreamGeometry geometry = new StreamGeometry();
using (StreamGeometryContext context = geometry.Open())
{
context.BeginFigure(Points[0], false, true);
foreach (Point pt in Points)
{
context.LineTo(pt, true, true);
}
geometry.Freeze();
return geometry;
}
}
}
我转而使用PathGeometry& LineSegments现在工作正常。