Стереть дочерние элементы InkCanvas

У меня есть InkCanvas в окне, в котором я разрешаю пользователю рисовать стилусом, касанием или мышью. Я также разрешаю пользователю добавлять текст. Пользователь нажимает кнопку «Добавить текст», а затем нажимает на то место на холсте, где он хотел бы разместить свой текст. Там появляется текстовое поле, позволяющее им печатать. При входе или потере фокуса я создаю ContentControl и добавляю его к myInkCanvas.Children.

Я хотел бы, чтобы пользователь мог стереть текст, который они создали, когда InkCanvas находится в режиме стирания (я использую EraseByPoint). Я попытался зафиксировать события MouseEnter и PreviewMouseMove элементов управления содержимым, но ни одно из них не сработало.

Есть ли событие, которое я могу зафиксировать? Есть ли лучший способ справиться с этим сценарием? Это вообще возможно?


person Ricky Smith    schedule 16.06.2011    source источник


Ответы (1)


Для этой цели вы можете использовать проверку попадания
см. здесь

получить 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 для удаления этого объекта

person Navid Rahmani    schedule 17.06.2011
comment
Итак, мне нужно было бы зафиксировать событие мыши на inkcanvas и для каждого события выполнить тест на попадание для каждого дочернего элемента inkcanvas? - person Ricky Smith; 17.06.2011
comment
Выглядит круто. Я не могу найти общую версию GetVisualChild. В каком пространстве имен это находится? - person Ricky Smith; 17.06.2011
comment
Не проблема. В итоге я создал тот, который был похож (но не так хорош), как ваш. - person Ricky Smith; 17.06.2011
comment
Все работает с проверкой попаданий. Я создаю EllipseGeometry, который соответствует размеру/форме курсора ластика для параметра попадания. В HitTestResultCallback я использую myInkCanvas.Children.Remove((UIElement)result.VisualHit);, но дочерний элемент не удаляется из inkcanvas. Любые идеи? - person Ricky Smith; 17.06.2011
comment
Да, конечно, вы можете использовать GeometryHitTestParameters - person Navid Rahmani; 17.06.2011