WPF Canvas - " live"添加/删除子元素的预览

时间:2014-04-30 12:28:17

标签: c# wpf canvas

在我的WPF应用程序中,我有一个for循环,在单击按钮后操作Canvas控件。

for (var i = 0; i < numOfIterations; i++)
{
    swarm.iterate();
    myCanvas.Children.Clear();
    for (int j = 0; j < numCities - 1; j++)
    {
        Line line = new Line();
        line.Stroke = System.Windows.Media.Brushes.Black;
        line.X1 = ScaleX(cities[swarm._gbestlist[j]].x, maxX);
        line.X2 = ScaleX(cities[swarm._gbestlist[j + 1]].x, maxX);
        line.Y1 = ScaleY(cities[swarm._gbestlist[j]].y, maxY);
        line.Y2 = ScaleY(cities[swarm._gbestlist[j + 1]].y, maxY);
        line.StrokeThickness = 2;
        myCanvas.Children.Add(line);
    }
}

正如您可能知道的那样,UI在循环执行期间没有响应,循环结束后,最后一次迭代后的结果是可见的。我该怎么做才能拥有一个&#34; live&#34;预览要添加和删除的行?

我尝试使用BackgroundWorker

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    double maxX = FindMaxX();
    double maxY = FindMaxY();
    for (int i = 0; i < 250; i++)
    {
        swarm.iterate();
        RemoveLines();
        for (int j = 0; j < cities.Count - 1; j++)
        {
            Line line = new Line();
            line.Stroke = System.Windows.Media.Brushes.Black;

            line.X1 = ScaleX(cities[swarm._gbestlist[j]].x, maxX);
            line.X2 = ScaleX(cities[swarm._gbestlist[j + 1]].x, maxX);
            line.Y1 = ScaleY(cities[swarm._gbestlist[j]].y, maxY);
            line.Y2 = ScaleY(cities[swarm._gbestlist[j + 1]].y, maxY);

            line.StrokeThickness = 2;  
            myCanvas.Children.Add(line);
        }
    }
}

但是我得到了

  

System.InvalidOperationException未被用户代码处理:   调用线程无法访问此对象,因为不同的线程   拥有它。

1 个答案:

答案 0 :(得分:0)

您仍然可以使用应用程序调度程序异步执行此操作。此外,如果使用Sinatr建议的计时器将迭代拆分为步骤,则可以获得所需的效果。

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new           
Action(DoWork)

希望它有所帮助。