我有一个DrawingGroup,其中包含从SVG文件创建的嵌套子项,我想将其渲染/转换为相应的嵌套DrawingVisual / Visual。
一个简单的渲染过程,如下所示......
DrawingGroup group; // assuming root group of diagrams
DrawingVisual visual = new DrawingVisual();
visual.DrawDrawing(group);
...将正确渲染绘图图形,但生成的视觉效果不包含任何子视觉效果;只创建一个没有孩子的视觉效果。
根的孩子也可能有变换的孩子,这可能是我目前失败的原因。
我需要嵌套的视觉来执行交互操作。有没有人做过类似的事情并愿意分享他/她的算法?
答案 0 :(得分:1)
我做的几乎一样:
我所有的孩子都来自绘画视觉。这非常简单。
public class VisualParent : DrawingVisual
{
public List<VisualObject> mChildren = new List<VisualObject>();
public VisualCollection mVisuals;
/// <summary>
/// Property AddVisual : Add visual child
/// </summary>
public void AddChild(VisualObject visual)
{
this.mChildren.Add(visual);
}
//Constructor
public VisualParent(Canvas canvas)
{
this.Canvas = canvas;
this.VisualParent = null;
mVisuals = new VisualCollection(canvas);
}
public override void Draw(DrawingContext canvas)
{
if (canvas == null)
{
throw new ArgumentNullException("drawingContext");
}
canvas.DrawRectangle(new SolidColorBrush(BackgroundColor), new Pen(new SolidColorBrush(ForegroundColor), ActualLineWidth), Rectangle);
base.Draw(canvas);
if (IsSelected)
{
DrawHandles(canvas);
}
// Draw children
foreach (VisualObject obj in this.mChildren)
{
obj.Draw(canvas);
}
}
}
由于drawingVisual无法管理孩子,因此您必须自己绘制所有孩子。
如果要移动对象或调整对象大小,则必须对对象执行相同的操作。