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

时间:2011-05-24 20:14:12

标签: c# silverlight windows-phone-7 line

我正在开发一个简单的绘图应用程序,以进一步提高我的技能,我似乎无法使用橡皮擦工具获得逻辑。该应用程序只需使用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次才能摆脱那条线。

有替代方案吗?

3 个答案:

答案 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); 不归还任何元素。