【问题标题】:Erase children of an InkCanvas擦除 InkCanvas 的子项
【发布时间】:2011-06-16 21:50:30
【问题描述】:

我在一个窗口上有一个InkCanvas,我允许用户在其中使用手写笔、触摸或鼠标进行绘图。我还允许用户添加文本。用户点击“添加文本”按钮,然后点击画布上他们想要文本的位置。一个文本框出现在那里,允许他们输入。在进入或失去焦点时,我创建一个 ContentControl 并将其添加到 myInkCanvas.Children

我希望用户能够在InkCanvas 处于擦除模式时擦除他们创建的文本(我正在使用EraseByPoint)。我试图捕获内容控件的MouseEnterPreviewMouseMove 事件,但似乎都没有触发。

有没有我可以捕捉的事件?有没有更好的方法来处理这种情况?有没有可能?

【问题讨论】:

    标签: c# wpf inkcanvas


    【解决方案1】:

    您可以为此目的使用命中测试
    here

    首先获取 InkPresenter

    public T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
                break;
        }
        return child;
    }
    
    InkPresenter inkPresenter = GetVisualChild<InkPresenter>(myInkCanvas);
    

    然后获取您的点的 HitTestResult

    HitTestResult hitTestResult = VisualTreeHelper.HitTest(inkPresenter, new Point(x, y));
    

    那么你可以使用hitTestResult.VisualHit 来移除这个对象

    【讨论】:

    • 那么,我需要在 inkcanvas 上捕获鼠标事件,并在每个事件上对 inkcanvas 的每个子项执行命中测试?
    • 看起来很酷。我似乎找不到 GetVisualChild 的通用版本。它在哪个命名空间中?
    • 没问题。我最终创建了一个与你的相似(但不如你的)的。
    • 一切都在进行命中测试。我正在制作一个 EllipseGeometry,它与 hit 参数的橡皮擦光标的大小/形状相匹配。在 HitTestResultCallback 中,我使用的是 myInkCanvas.Children.Remove((UIElement)result.VisualHit);,但子元素并未从 inkcanvas 中删除。有什么想法吗?
    • 是的,你可以使用GeometryHitTestParameters
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多