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

Я создаю программу САПР в 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

Проверьте свойство Рисунок DrawingVisual. Должен быть GeometryDrawing с вашей геометрией. Тем не менее, использование визуальных элементов здесь кажется слишком сложным. Я уверен, что вы могли бы также использовать элементы Path.

Clemens 28.07.2018 23:47

Я могу извлечь этот GeometryDrawing, но как это поможет? Я до сих пор не могу сказать, нахожусь ли я над прямоугольником или линией. Стоит ли мне это разбирать или что-то в этом роде, и это мне скажет? Например, если LineGeometry имеет длину 20 байтов, а Rectangle - 40 байтов? Я могу столкнуться с проблемами, если два типа получат одинаковое количество байтов (что, очевидно, не применимо к Line или Rect, но для другой геометрии, когда добавляются другие конструкции. Жаль, что нет никакого способа войти в код DrawingVisual и добавление к нему свойства, например Visual.Line или Visual.Rect.

SojourningStudent 29.07.2018 00:53

Затем конечно проверяет, содержит ли свойство Geometry объекта GeometryDrawing объект RectangleGeometry или что-то еще (с помощью оператора is или as). Серьезно, вам следует подумать о более простом подходе.

Clemens 29.07.2018 00:55

ОК. Я выбрал DrawingVisual из-за скорости. Когда все будет готово, на экране будет перемещаться много всего. Это будет похоже на анимированную картину. По своей сути, все является PathGeometry. Итак, если у меня сложная форма, скажем, человеческая фигура для одного DrawingVisual и фигура звезды для другого, мне все равно нужно различать их. DrawingVisual был выбран из-за скорости, но какие еще подходы вы имеете в виду?

SojourningStudent 29.07.2018 01:04

Как уже было сказано, Path elements. Вы можете привязать их свойство Data к свойству Geometry класса модели представления и организовать их в ItemsControls. Вы не должны оптимизировать скорость, пока у вас не возникнет серьезная проблема с производительностью.

Clemens 29.07.2018 01:24

ОК. Я пойду этим маршрутом.

SojourningStudent 29.07.2018 03:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
189
0

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