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