等效于绘图应用程序的橡皮擦,c#,silverlight,wp7

问题描述

|| 我正在开发一个简单的绘图应用程序,以进一步提高我的技能,但我似乎无法完全理解橡皮擦工具的逻辑。该应用程序仅使用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); 不返回任何元素。