WPF - 当BackgroundWorker完成时,Canvas不会更新

时间:2015-10-19 14:03:44

标签: wpf multithreading user-interface canvas

我需要在BackgroundWorker完成后更新我的Canvas。当我通过按钮actionlistener更新Canvas时,它工作得很完美。但是当我在backroundWorker完成时调用我的更新功能时。 gui不会更新。

将项目添加到画布的功能:

public void AddItemsToCanvas()
    {

       int factor = 0;

       cvList.Children.Clear();
       foreach (ItemControl item in ItemControl.ItemsList)
       {

           cvList.Children.Add(item.updateName);
           Canvas.SetLeft(item.updateName, 13);
           Canvas.SetTop(item.updateName, factor + 10);
           Canvas.SetZIndex(item.updateName, 1);

           cvList.Children.Add(item.imageButton);
           Canvas.SetLeft(item.imageButton, 180);
           Canvas.SetTop(item.imageButton, factor + 13);
           Canvas.SetZIndex(item.imageButton, 5);}}

调用更新功能的按钮:

private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        updateCanvas();
    }

    public void updateCanvas()
    {
            Service serv = new Service();
            serv.SuperlinkCompartments();

            //Check for updates and add them to a List of updates
            Update up = new Update();
            up.PropertyChanged += new PropertyChangedEventHandler(Items_PropertyChanged);
            up.ShowUpdates();      
    }

    public void Items_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        AddItemsToCanvas();
    }

从按钮actionListener调用时,Canvas会完美更新。但是当从BackgroundWorker事件调用UpdateCanvas()时不起作用。

public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        var item = dic3[(BackgroundWorker)sender];
        int index = (int)item.controlButton.Tag;
        item.Progressbar.Value = 0;

        SystemInfo.SystemList[Update.UpdateList[index].SystemIndex].Version = Update.UpdateList[index].UpdateVersion;


        lvSystems.ItemsSource = SystemInfo.SystemList;

        updateCanvas();

    }

我在BackgroundWorker事件函数中遗漏了什么?

1 个答案:

答案 0 :(得分:0)

尝试使用`Dispatcher':

Application.Current.Dispatcher.Invoke(new Action(()=>
{
    updateCanvas();
}), DispatcherPriority.Render);

然后,在updateCanvas()方法中,在最后添加以下内容:

cvList.UpdateLayout();