.net - 尝试使用 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);
}
解决方案
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);
}
推荐阅读
- python - 在 Python 中创建骰子模拟器,如何找到最常见的骰子
- mysql - 以列名作为 WHERE 子句参数的 MySQL 查询
- ios - 无法以编程方式将 UIImageView 添加为 UIView 的子视图
- powershell - 如何读取内部文件值并创建目录然后移动文件 PowerShell?
- css - 无法摆脱右边的填充
- python-3.x - Python not working after installing numpy
- windows - How to delete registry entry with batch command?
- powerbi - 每月单独计算的 YTD 度量
- javascript - react-native 导航返回时重新运行功能
- javascript - Conflict on JS files after combining Material Design Lite and Bootstrap 4