WPF:Animated Line减慢了UI的速度

时间:2014-02-17 14:50:23

标签: c# wpf xaml

我在我的UI中画了一条线,每次重绘图形时都需要更新。由于我希望我的UI仍然具有响应性(目前不是这样),我使用的是每次呈现UI时都会调用的后台工作程序。如上所述,在绘制线条时,UI变得无响应且速度慢。有什么我可以改变来改进我的软件吗?

这是我正在使用的代码(至少是相关的部分)。

BackgroundWorker _worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);

void CompositionTarget_Rendering(object sender, EventArgs e)
{
    if (!_worker.IsBusy) { _worker.RunWorkerAsync(); }
}

我使用的线是由Point []数组生成的。为了确保没有其他因素减慢软件速度,我将生成线分解为仅使用虚拟值:

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    Dispatcher.BeginInvoke((Action)delegate
    {
        Point[] line = new Point[480];

        MySegment1.Points.Clear();
        bool isStart = true;

        for (int i = 0; i < line.Length; i++)
        {
            line[i] = new Point(0, 0);
            if (isStart)
            {
                MyFigure1.StartPoint = line[i];
                isStart = false;
            }
            else
                MySegment1.Points.Add(new Point(i, line[i].Y + 10));
        }
    });
}

该行的XAML如下所示:

<Path Stroke="GreenYellow" StrokeThickness="2" Name="MyPath1"  Grid.Column="1">
    <Path.Data>
        <PathGeometry>
            <PathGeometry.Figures>
                <PathFigureCollection>
                    <PathFigure x:Name="MyFigure1" StartPoint="0,0">
                        <PathFigure.Segments>
                            <PathSegmentCollection>
                                <PolyBezierSegment x:Name="MySegment1"/>
                            </PathSegmentCollection>
                        </PathFigure.Segments>
                    </PathFigure>
                </PathFigureCollection>
            </PathGeometry.Figures>
        </PathGeometry>
    </Path.Data>
</Path>

非常感谢任何推荐!

编辑:除了Clemens的回答,我还将DispatcherPriority更改为System.Windows.Threading.DispatcherPriority.ApplicationIdle,这也增加了UI的责任。我认为这是一个我现在可以忍受的状态...... :)

1 个答案:

答案 0 :(得分:4)

如果您没有逐点更新PolyBezierSegment,而是创建新的PointCollection并将其分配给PolyBezierSegment的Points属性,则不需要所有这些BackgroundWorker“优化” :

private Random random = new Random(); // creates some sample data

private void CompositionTarget_Rendering(object sender, EventArgs e)
{
    var line = new Point[480];

    for (int i = 0; i < line.Length; i++ )
    {
        line[i] = new Point(i, random.Next(0, 100));
    }

    MyFigure1.StartPoint = line[0];
    MySegment1.Points = new PointCollection(line); // here
}

另请注意,WPF提供的渲染图形比Path控件中的PathGeometry更有效。您可以开始阅读MSDN上的Graphics and Multimedia文章。