0

我有一个面板,我在代码中构建并使用用户控件填充它。当它完成填充时,我向主 GUI 提出一个事件,告诉它填充完成并传递堆栈面板。

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

我努力了

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

还有空委托选项,但总是从TargetOfInvocation

我究竟做错了什么?

4

2 回答 2

0

我不确定你做错了什么,但它应该通过简单地使用调度程序来工作。尝试使用包含面板的 Window 调度程序:

MyWindow.Dispatcher.Invoke((Action)delegate 
    {
        MyWindow.grdPbContent.Children.Add(_sp);
    });
于 2012-06-20T17:47:48.283 回答
0

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

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

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

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

于 2012-06-20T19:27:35.677 回答