我需要在画布的背景上绘制网格线,并在其上放置其他控件.
我尝试创建一个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; }
小智.. 6
我的建议是保持原始数量下降.您正在使WPF花费CPU周期和带宽创建并将大量网格发送到渲染线程和GPU.
DrawingBrush是一个TileBrush.
将一个网格单元绘制到DrawingImage上,并使用TileMode,Viewbox和Viewport属性来平铺网格.
我的建议是保持原始数量下降.您正在使WPF花费CPU周期和带宽创建并将大量网格发送到渲染线程和GPU.
DrawingBrush是一个TileBrush.
将一个网格单元绘制到DrawingImage上,并使用TileMode,Viewbox和Viewport属性来平铺网格.