我正在开发一个简单的绘图应用程序,以进一步提高我的技能,但我似乎无法理解橡皮擦工具的逻辑。该应用程序仅使用 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 次才能去掉那里的线。
有替代方案吗?
最佳答案
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);
}
请注意,不要将 FindElementsInHostCooperatives 的结果强制转换为 List<T>
,这是一个实现细节,文档仅保证它是 IEnumerable<UIElement>
,除此之外,这是一个不必要的强制转换。
关于c# - 相当于绘图应用程序的橡皮擦、c#、silverlight、wp7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6116294/