我需要在 Canvas 的背景上绘制网格线,并在其上放置其他控件。
我尝试创建一个StreamGeometry,使用它绘制线条,并将其分配给DrawingBrush。但是,我发现,如果StreamGeometry行太多,则在将DrawingBrush分配给Canvas之后,程序会变得缓慢。
无论如何,是否存在“预渲染”网格线并将其分配给Canvas?
我尝试用Freeze()
编码画笔和几何图形,但这似乎不起作用。我还有什么其他选择?
这是我的代码:
public void RenderGrid()
{
this.UpdateGrid();
Pen grid_pen = new Pen(Brushes.Blue, 0.1);
StreamGeometry sg = new StreamGeometry();
DrawingBrush b = new DrawingBrush();
GeometryDrawing gd = new GeometryDrawing();
gd.Geometry = sg;
gd.Pen = grid_pen;
b.Drawing = gd;
StreamGeometryContext ctx = sg.Open();
foreach (double d in this.VerticalGrids)
{
ctx.BeginFigure(new Point(d, 0), true, false);
ctx.LineTo(new Point(d, this.RenderSize.Height), true,false);
}
foreach (double d in this.HorizontalGrids)
{
ctx.BeginFigure(new Point(0, d), true, false);
ctx.LineTo(new Point(this.RenderSize.Width, d),true, false);
}
ctx.Close();
sg.Freeze();
gd.Freeze();
b.Freeze();
this.Background = b;
}
最佳答案
我的建议是减少原始计数。您正在使WPF花费CPU周期和带宽来创建大量网格并将其发送到渲染线程和GPU。
DrawingBrush是TileBrush。
在DrawingImage上绘制一个网格单元,并使用TileMode,Viewbox和Viewport属性来平铺网格。