Визуальное редактирование графических объектов в WPF - PullRequest
0 голосов
/ 15 декабря 2011

Существует графический редактор WPF, предназначенный для работы с диаграммами. Поскольку диаграмма может состоять из очень большого количества объектов, было выбрано использовать чертежи для вывода. Это означает, что мы создаем список некоторых бизнес-объектов

class BusinessObject
{
   // bunch of other properties and methods
   public GeometryDrawing MyDrawing {get;set;}
}

передать его помощнику, который создает DrawingVisual для каждого рисунка:

public List<Visual> BuildVisuals(List<BusinessObject> objectsList)
{
   // foreach item in objectsList takes item.MyDrawing and draws it with DrawingContext
}

, а затем внедрить полученные данные в хост рисования

public class VisualHost : FrameworkElement
{
   // FrameworkElement overrides, skipped

   public readonly VisualCollection _children;       

   public VisualHost(List<Visual> visualsList)
   {
     _children = new VisualCollection(this);
     foreach(var visual in visualsList)
     {
        _children.Add(visual);
     }
     // mouse handlers, other logic (skipped)
   }
}

Все работает хорошо и быстро (даже VisualHitTesting с обратным отображением на соответствующий бизнес-объект с двусторонним изменением данных на лету), но теперь необходимо разрешить визуальное редактирование объектов - перемещение их по рабочему пространству, изменение размер, масштабное соотношение и т. д. Вспоминаются WPF Thumbs and Adorners (http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx),, но они предназначены для работы с UIElement / Controls, а не для наших визуалов. Кто-нибудь видит способ решить эту проблему без значительных изменений исходного логика? Может быть, есть некоторые обходные пути или похожая функциональность. Переписать вышеупомянутый код нельзя, у нас не может быть более 1000 объектов Control в памяти, если мы будем использовать их на диаграмме. Заранее спасибо.

1 Ответ

0 голосов
/ 11 сентября 2012

Проблема была решена вручную - изменение размера и вращающиеся украшения были нарисованы как отдельные объекты поверх существующих и добавлены / удалены с холста при установленном / потерянном фокусе.

...