尝试使用 DrawingContext 进行绘制,但是当我尝试调用 Close() 时,出现 StackOverflowException

Trying to draw using DrawingContext,but when I try calling Close(), a StackOverflowException occurs

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

我通过将它们添加到 DrawingGroup 来完成此操作。我 Open() 绘图组,添加 GeometryDrawings,使用 DrawingContext 绘制组,然后 Close() DrawingContext。我将结果添加到 Image.Source 并将其添加到 canvas.

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

    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);
    }

WhosebugException 的原因是

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);
}