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

本文关键字:图形 对象 编辑 可视化 WPF | 更新日期: 2023-09-27 18:18:02

有一个设计用于处理图表的图形WPF编辑器。因为diagram可以由非常多的对象组成,所以选择使用Drawings进行输出。这意味着我们创建一些业务对象的列表

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),但它们旨在与ui/控件一起工作,而我们的视觉效果不是。有没有人能找到不改变初始逻辑就能解决这个问题的方法?一些变通方法或类似的功能。重写上面提到的代码不是一个选择,如果我们在图表上使用它们,我们不能在内存中拥有1000多个Control对象。

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

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