我正在开发一个简单的绘图应用程序,以进一步提高我的技能,我似乎无法使用橡皮擦工具获得逻辑。该应用程序只需使用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次才能摆脱那条线。
有替代方案吗?
答案 0 :(得分:3)
e.GetPosition(tree)
将返回一个点。请尝试使用以位置为中心的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的结果强制转换为List<T>
,这是一个实现细节,文档只保证它是IEnumerable<UIElement>
,除此之外它是一个不必要的强制转换。
答案 1 :(得分:1)
您实际上正在寻找与单个像素的命中测试相匹配的元素集。如果你的线条狭窄,那就像大海捞针;很难准确地删除它。
相反,您需要使用矩形而不是点来使用模糊匹配。您可以使用相同的API,只使用它的矩形版本:
答案 2 :(得分:0)
VisualTreeHelper.FindElementsInHostCoordinates(r,MainCanvas); 不归还任何元素。