DrawingContext.DrawLine性能问题

wil*_*ord 6 wpf

我正在尝试不同的策略,用于从控件的左边缘到右边缘绘制图形.到目前为止,我们使用的是带有折线的Canvas,它可以正常运行,但仍然可以使用一些改进.

当我尝试使用DrawingContext.DrawLine时,我遇到了令人难以置信的糟糕表现,我无法弄清楚原因.这是我能提出的最简洁的代码,它演示了这个问题:

public class TestControl : Control {

    static Pen pen = new Pen(Brushes.Gray, 1.0);
    static Random rnd = new Random();

    protected override void OnRender(DrawingContext drawingContext) {

        var previousPoint = new Point(0, 0);

        for (int x = 4; x < this.ActualWidth; x += 4) {
            var newPoint = new Point(x, rnd.Next((int)this.ActualHeight));
            drawingContext.DrawLine(pen, previousPoint, newPoint);
            previousPoint = newPoint;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而MainWindow.xaml只包含这个:

<StackPanel>
    <l:TestControl Height="16"/>
    <!-- copy+paste the above line a few times -->
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

现在调整窗口大小:根据StackPanel中TestControls的数量,我会遇到明显的延迟(10个控件)或30秒完全停顿(100个控件),我甚至无法点击"停止调试器"-Button在VS ...

我对此很困惑,显然我做错了但是由于代码很简单,我看不出那可能是什么......我正在使用.Net4以防万一.

Mar*_*nov 8

你可以通过冻结笔来获得性能.

static TestControl()
{
    pen.Freeze();
}
Run Code Online (Sandbox Code Playgroud)