首页 > 解决方案 > 尝试使用 DrawingContext 进行绘制,但是当我尝试调用 Close() 时,发生 StackOverflowException

问题描述

我正在尝试在 Canvas 上绘制 ~150 个 GeometryDrawing 对象。

我通过将它们添加到绘图组来做到这一点。在绘图组Open()中,添加 GeometryDrawings,使用 绘制组,DrawingContext然后Close()使用DrawingContext. 我将结果添加到 aImage.Source并将其添加到画布中。

关闭时,我的应用程序抛出一个System.StackOverflowException,我似乎无法找出原因?

    internal void Draw(List<GameObject> gameObjects, List<Ray> lighting)
    {
        DrawingGroup group = new DrawingGroup();
        List<GeometryDrawing> geometries = new List<GeometryDrawing>();
        geometries.AddRange(Draw(gameObjects));
        geometries.AddRange(Draw(lighting));

        DrawingContext dc = group.Open();
        foreach (GeometryDrawing g in geometries)
        {
            group.Children.Add(g);
        }
        dc.DrawDrawing(group);
        dc.Close();

        Image image = new Image();
        image.Width = 800;
        image.Height = 500;
        DrawingImage di = new DrawingImage(group);
        image.Source = di;

        Canvas.SetTop(image, 0);
        Canvas.SetLeft(image, 0);
        canvas.Children.Add(image);
    }

标签: .netwpfxamlsystem.windows.media

解决方案


StackOverflowException 的原因是

dc.DrawDrawing(group);

添加group到自己的Children集合中,导致无限递归。

您正在混合填充 DrawingGroup 的子项的方法。要么直接将绘图添加到Children集合中,要么使用 DrawingContext 来填充集合,而不是同时使用两者。

这应该有效:

using (var dc = group.Open())
{
    foreach (var g in geometries)
    {
        dc.DrawDrawing(g);
    }
}

或者根本不使用 DrawingContext:

foreach (var g in geometries)
{
    group.Children.Add(g);
}

推荐阅读