Существует графический редактор 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 в памяти, если мы будем использовать их на диаграмме. Заранее спасибо.