在WPF中可视化编辑图形对象

时间:2011-12-15 15:35:15

标签: c# wpf graphics drawing editing

有一个图形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一起使用,我们的Visuals不是&# 39;吨。有没有人在没有太多初始逻辑变化的情况下看到解决这个问题的方法?一些解决方法或类似的功能可能。重写上面提到的代码不是一个选项,如果我们在图上使用它们,我们就不能在内存中有1000多个Control对象。提前谢谢。

1 个答案:

答案 0 :(得分:0)

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