Я создаю программу САПР в 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
Я могу извлечь этот GeometryDrawing, но как это поможет? Я до сих пор не могу сказать, нахожусь ли я над прямоугольником или линией. Стоит ли мне это разбирать или что-то в этом роде, и это мне скажет? Например, если LineGeometry имеет длину 20 байтов, а Rectangle - 40 байтов? Я могу столкнуться с проблемами, если два типа получат одинаковое количество байтов (что, очевидно, не применимо к Line или Rect, но для другой геометрии, когда добавляются другие конструкции. Жаль, что нет никакого способа войти в код DrawingVisual и добавление к нему свойства, например Visual.Line или Visual.Rect.
Затем конечно проверяет, содержит ли свойство Geometry объекта GeometryDrawing объект RectangleGeometry или что-то еще (с помощью оператора is или as). Серьезно, вам следует подумать о более простом подходе.
ОК. Я выбрал DrawingVisual из-за скорости. Когда все будет готово, на экране будет перемещаться много всего. Это будет похоже на анимированную картину. По своей сути, все является PathGeometry. Итак, если у меня сложная форма, скажем, человеческая фигура для одного DrawingVisual и фигура звезды для другого, мне все равно нужно различать их. DrawingVisual был выбран из-за скорости, но какие еще подходы вы имеете в виду?
Как уже было сказано, Path elements. Вы можете привязать их свойство Data к свойству Geometry класса модели представления и организовать их в ItemsControls. Вы не должны оптимизировать скорость, пока у вас не возникнет серьезная проблема с производительностью.
ОК. Я пойду этим маршрутом.





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