将StackPanel添加到Grid.Children集合从另一个线程

时间:2012-06-20 15:31:35

标签: wpf dispatcher

我有一个Panel,我在代码中构建并使用用户控件填充它。 当它完成填充时,我向主GUI发出一个事件,告诉它已完成填充并且我通过了堆栈面板。

然后我想将此面板添加到容器网格中。

我试过了

   grdPbContent.Dispatcher.Invoke(
       DispatcherPriority.Normal, 
       new Action<StackPanel>(
           delegate(StackPanel _sp)
           {
                grdPbContent.Children.Add(_sp);
           }
       ),
       sp);`

以及空委托选项,但始终从TargetOfInvocation

获取异常

我做错了什么?

2 个答案:

答案 0 :(得分:0)

我不确定你做错了什么,但只需使用调度程序即可。尝试使用包含面板的Window的调度程序:

MyWindow.Dispatcher.Invoke((Action)delegate 
    {
        MyWindow.grdPbContent.Children.Add(_sp);
    });

答案 1 :(得分:0)

WPF对象不能由创​​建它们的线程以外的线程修改,因此您无法在一个线程上创建StackPanel并将其添加到在另一个线程上创建的Grid

要在后台进行处理,请使用Dispatcher以不同的DispatcherPriority运行代码,例如Background

您可以使用Application.Current.Dispatcher从代码中的任何位置获取当前应用程序的UI线程。

如果它是一个非常长的进程,无论其运行的优先级如何都会锁定UI,那么只从另一个线程获取数据,并在返回数据后在主UI线程上构建UI对象。