问题描述
||
我正在开发一个简单的绘图应用程序,以进一步提高我的技能,但我似乎无法完全理解橡皮擦工具的逻辑。该应用程序仅使用Line类在用户移动手指时创建线条。对于橡皮擦工具,我尝试如下使用VisualTreeHelper:
List<UIElement> elements = (List<UIElement>)VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(tree),ContentPanelCanvas);
foreach (UIElement element in elements)
{
if (element is Line)
{
this.ContentPanelCanvas.Children.Remove(element);
}
}
在某些时候,它可能非常缓慢且缓慢。有时,我必须触摸该区域5次以上才能摆脱那里的界线。
是否有替代方法?
解决方法
ѭ1将返回一个点。尝试使用以位置为中心的
Rect
。
const double fingerMargin = 10.0;
Point p = e.GetPosition(tree);
Rect r = new Rect(p.X - fingerMargin,p.Y - fingerMargin,fingerMargin * 2,fingerMargin * 2);
var elements = VisualTreeHelper.FindElementsInHostCoordinates(r,ContentPanelCanvas);
Line lineToRemove = elements.OfType<Line>().FirstOrDefault();
if (lineToRemove != null)
{
ContentPanelCanvas.Children.Remove(lineToRemove);
}
请注意,不要将FindElementsInHostCoordinates的结果强制转换为ѭ4is,这是实现细节,文档仅保证其为IEnumerable<UIElement>
,此外,它也是不必要的强制转换。
,您实际上是在寻找与单个像素的点击测试匹配的元素集。如果你的线很窄,那就像大海捞针。很难准确地将其删除。
相反,您需要使用矩形而不是点的模糊匹配。您可以使用相同的API,只是它的矩形版本:
VisualTreeHelper.FindElementsInHostCoordinates方法(Rect,UIElement)
,VisualTreeHelper.FindElementsInHostCoordinates(r,MainCanvas);
不返回任何元素。