2011-12-15 81 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) 
    } 
} 

一切工作正常,并且很快(甚至是VisualHitTesting,通过向后映射到各个业务对象,双向数据即时更改),但现在需要允许可视化对象的编辑 - 移动周围的工作空间,改变大小,缩放比例等WPF大拇指和装饰器进入脑海(http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx),但他们是为了工作与UIElement/Controls,我们的视觉不是。有没有人看到一种方法来解决这个问题没有太多的初始逻辑的变化?可能有一些解决方法或类似的功能。重写上述代码不是一个选项,如果我们在图上使用它们,我们不能在内存中拥有超过1000个控件对象。提前致谢。

+0

创建某种优化,当FrameworkElement的接收鼠标焦点,将它包装在一个或的UIElement控制,那么当它失去,回FrameworkElement的..? – 2011-12-15 18:22:59

回答

0

问题是手动解决 - 调整大小和旋转装饰器被绘制为在现有的独立的对象,并添加/从集合/失去焦点画布除去。