首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DrawingBrush性能

WPF DrawingBrush性能
EN

Stack Overflow用户
提问于 2008-11-23 10:47:11
回答 3查看 5.7K关注 0票数 2

我需要在画布的背景上绘制网格线,这将有其他控件放置在上面。

我尝试创建一个StreamGeometry,使用它来绘制线条,并将其分配给一个DrawingBrush。但是,我发现如果StreamGeometry的行数太多,那么在将DrawingBrush分配给Canvas之后,程序就会变得很慢。

有没有“预渲染”网格线并将其分配到画布的方法?

我尝试了Freeze()画笔和几何体,但似乎不起作用。我还有其他选择吗?

下面是我的代码:

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

发布于 2008-11-24 03:00:07

我的建议是减少原语的计数。您正在让WPF花费CPU周期和带宽来创建大量网格,并将其发送到渲染线程和GPU。

DrawingBrush是一个TileBrush

将网格的一个单元绘制到DrawingImage上,并使用TileMode、Viewbox和Viewport属性来平铺网格。

票数 6
EN

Stack Overflow用户

发布于 2009-01-08 06:21:58

solution offered by Ifeanyi Echeruo对我来说工作得非常好。但是,我还需要网格动态缩放。我没有每次都重新构建画笔,而是使用了一个xaml定义的画笔作为元素的背景,然后实现了一些钩子来在每次需要调整网格线的大小时重新缩放画笔。

在元素的Background属性上使用LocalValueEnumerator,每次需要重新缩放时,我都会更新画笔的"Viewport“属性

代码语言:javascript
复制
<DrawingBrush x:Key="MyBrush" TileMode="Tile" Stretch="Fill" 
  Viewport="0,0,250,250" ViewportUnits="Absolute">


LocalValueEnumerator props = Background.GetLocalValueEnumerator();
while (props.MoveNext())
{
  DependencyProperty prop = props.Current.Property;
  if ((prop.Name == "Viewport") && (!prop.ReadOnly))
  {
    Background.SetValue(prop, new Rect(0, 0, m_ColumnWidth, m_RowHeight));
  }
}
票数 3
EN

Stack Overflow用户

发布于 2008-11-23 19:32:20

一种解决方案是覆盖面板上的OnRender(DrawingContext dc)方法,并在其中绘制线条。

另一种选择是使用一个轻量级的可视化元素来绘制线条。此元素应添加到面板的可视化树中。当ShowGridLines属性设置为true时,标准WPF Grid控件使用类似的方法在行和列之间绘制线条。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/312379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档