Существует графический редактор WPF, предназначенный для работы с диаграммами. Поскольку диаграмма может состоять из очень большого количества объектов, было выбрано использование чертежей для вывода. Это означает, что мы создаем список некоторых бизнес-объектовВизуальное редактирование графических объектов в 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)
}
}
Everything работает отлично и быстро (даже VisualHitTesting с обратным отображением на соответствующий бизнес-объект с двухсторонним изменением данных на лету), но теперь есть необходимость разрешить визуальное редактирование объектов - перемещение их вокруг рабочего пространства, изменение размера, масштабное соотношение и т. д. WPF Thumbs and Adorners приходят в голову (http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx), но они предназначены для работы с UIElement/Controls, что наши визуальные объекты не являются. Кто-нибудь видит способ решить эту проблему без значительных изменений исходной логики? Возможно, возникнут некоторые обходные пути или аналогичная функциональность. Перезапись вышеупомянутого кода не является вариантом, мы не можем иметь 1000+ объектов Control в памяти, если мы используем их на диаграмме. Заранее спасибо.
Создайте какую-то оптимизацию, когда FrameworkElement получает фокус мыши, оберните его в UIElement или Control, а затем, когда он проиграет, вернитесь к FrameworkElement ..? –
Мысль об этом ... Но упаковка FE сама ничего не даст, потому что мне нужно украсить своих детей, а не всю картину вообще. – Jaded
Итак, у вас есть контейнер (например, Window), который имеет один «MultiDrawingVisualHost» или много «MultiDrawingVisualHost»? Или это «MultiDrawingVisualHost» единственный хост, и он имеет 1000 объектов? Пожалуйста, определите проблему немного лучше. –