我有一个Panel,我在代码中构建并使用用户控件填充它。 当它完成填充时,我向主GUI发出一个事件,告诉它已完成填充并且我通过了堆栈面板。
然后我想将此面板添加到容器网格中。
我试过了
grdPbContent.Dispatcher.Invoke(
DispatcherPriority.Normal,
new Action<StackPanel>(
delegate(StackPanel _sp)
{
grdPbContent.Children.Add(_sp);
}
),
sp);`
以及空委托选项,但始终从TargetOfInvocation
我做错了什么?
答案 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对象。