2011-12-15 3 views
0

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

+0

Создайте какую-то оптимизацию, когда FrameworkElement получает фокус мыши, оберните его в UIElement или Control, а затем, когда он проиграет, вернитесь к FrameworkElement ..? –

+0

Мысль об этом ... Но упаковка FE сама ничего не даст, потому что мне нужно украсить своих детей, а не всю картину вообще. – Jaded

+0

Итак, у вас есть контейнер (например, Window), который имеет один «MultiDrawingVisualHost» или много «MultiDrawingVisualHost»? Или это «MultiDrawingVisualHost» единственный хост, и он имеет 1000 объектов? Пожалуйста, определите проблему немного лучше. –

ответ

0

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

Смежные вопросы