在论坛和MSDN上,他们使用Dispatcher.Invoke明确了从不同线程访问UI控件的方法。但是,在UI线程中,如何访问在不同线程上创建的DataGrid之外的WPF组件?
在我的情况下,我启动一个线程来处理一个漫长的过程。在这个线程中,我创建了一个DataTable,并将其绑定到也在此线程中创建的DataGrid。
现在,当需要显示DataGrid时,我在UI控件上适当地调用Dispatcher.Invoke。但是,当我尝试在我的UI线程中访问DataGrid时,我得到一个异常 - 调用线程无法访问此对象,因为另一个线程拥有它。
请提出任何建议..
public void AddResultsController(ResultsController controller)
{
NewResultsControllerDisplayDelegate newControllerDisplayDelegate = new NewResultsControllerDisplayDelegate(NewResultsControllerDisplay);
this.docManager.Dispatcher.BeginInvoke(newControllerDisplayDelegate, System.Windows.Threading.DispatcherPriority.Normal, controller);
}
delegate void NewResultsControllerDisplayDelegate(ResultsController controller);
private void NewResultsControllerDisplay(ResultsController controller)
{
Grid grd = new Grid();
grd.Children.Add(controller.SummaryDataGrid); // Exception is thrown here
}
在我的后台帖子中,我打电话给...
m_mainWindow.AddResultsController(m_controller);
答案 0 :(得分:1)
您只需不在后台线程上创建UI元素。让您的生活更轻松,并遵循该规则。
答案 1 :(得分:0)
试试这个:
public void AddResultsController(ResultsController controller)
{
NewResultsControllerDisplayDelegate newControllerDisplayDelegate = new NewResultsControllerDisplayDelegate(NewResultsControllerDisplay);
Grid grd = new Grid();
grd.Children.Add(controller.SummaryDataGrid);
this.docManager.Dispatcher.BeginInvoke(newControllerDisplayDelegate, System.Windows.Threading.DispatcherPriority.Normal, grd);
}
delegate void NewResultsControllerDisplayDelegate(ResultsController controller);
private void NewResultsControllerDisplay(Grid grd)
{
this.docManager.Add(grd);
}
H个。