WPF:将嵌套的DrawingGroup转换为嵌套的DrawingVisual

时间:2010-08-17 05:56:18

标签: wpf

我有一个DrawingGroup,其中包含从SVG文件创建的嵌套子项,我想将其渲染/转换为相应的嵌套DrawingVisual / Visual。

一个简单的渲染过程,如下所示......

DrawingGroup group; // assuming root group of diagrams
DrawingVisual visual = new DrawingVisual();

visual.DrawDrawing(group);

...将正确渲染绘图图形,但生成的视觉效果不包含任何子视觉效果;只创建一个没有孩子的视觉效果。

根的孩子也可能有变换的孩子,这可能是我目前失败的原因。

我需要嵌套的视觉来执行交互操作。有没有人做过类似的事情并愿意分享他/她的算法?

1 个答案:

答案 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无法管理孩子,因此您必须自己绘制所有孩子。

如果要移动对象或调整对象大小,则必须对对象执行相同的操作。