如何解决等效于绘图应用程序的橡皮擦,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);
不返回任何元素。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。