Схема для отслеживания DrawingVisual в WPF DrawingVisual

Я создаю программу CAD в WPF, которая добавляет и удаляет линии и прямоугольники, которые описаны в PathGeometry. Когда я углублюсь в программу, она будет содержать множество различных PathGeometries, каждая из которых составляет свойство отдельных DrawingVisuals. Я использую класс Visual для повышения производительности.

Поскольку каждое DrawingVisual практически идентично, поскольку все, что он представляет собой - это просто DrawingVisual, составленное из PathGeometry, у него нет уникального идентификатора. Мне нужен какой-то идентификатор, чтобы при щелчке правой кнопкой мыши по линии или прямоугольнику я мог нарисовать на нем несколько маркеров, чтобы сделать его модифицируемым с помощью мыши. (Я хочу, чтобы конечные точки линии были подвижными, прямоугольник растягивался и т. Д.) Существуют примеры линейных маркеров на линиях, кривых Безье и т. Д., Но они не касаются проблемы наличия различных типы.

В приведенном ниже коде, который похож на мой, щелчок мыши возвращает объект DrawingVisual. Но, поскольку у DrawingVisuals нет какой-либо специальной функции, которая говорит: "Это прямоугольник" или "Это линия", мне нужно найти способ получения этой информации из результата HitTestResult. Зная это, я могу определить, как к нему обращаться, когда я хочу изменить его. Линия будет иметь 2 контрольные точки, прямоугольник будет иметь 4, а некоторые из моих других (еще не сделанных) геометрий будут иметь 6 или более контрольных значений.

Когда я захожу на VisualTree в режиме отладки (доступный через Debug>Window), все, что он говорит, это "DrawingVisual". Недостаточно информации, чтобы понять, как рассматривать ее как линию или прямоугольник.

Таким образом, в программах САПР с широким париком они позволяют вам изменять объект, на который вы щелкнули. У программного обеспечения есть некоторый способ узнать, на что вы нажали, и я хотел бы, чтобы эта функция была в моей программе САПР начального уровня.

Я пытался использовать функцию отладки и искал какой-то уникальный идентификатор, но не смог его найти. Я думал об использовании List и предоставлении каждого элемента по мере его создания, но у меня нет никакого способа связать его с результатом HitTestResult.

Это можно сделать, так что это не проблема, но мне нужна схема для имитации того, как программы САПР выполняют эту функцию.

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);

    if (result != null)
    {
        // Perform action on hit visual object.
    }
}

Буду признателен за любую помощь в объяснении, как это сделать. По сути, какова схема, которую используют высокопроизводительные программы САПР для отслеживания того, на какой тип визуальной информации щелкнула мышь?

TYIA

0 ответов

Другие вопросы по тегам