2011-09-14 37 views
1

在论坛和MSDN上,他们已经给出了一个清晰的方法来使用Dispatcher.Invoke从不同线程访问UI控件。但是,在UI线程中,如何访问在不同线程上创建的DataGrid的WPF组件?如何访问在UI线程中的不同线程上创建的DataGrid?

在我的情况下,我开始一个线程来处理一个漫长的过程。在这个线程中,我创建一个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

我想使用Dispatcher.Invoke()是正确的做法。 你可以发布你的代码? – Thinhbk

+0

已发布我的代码.. –

+0

请帮助...我卡住了,无法继续前进。 –

回答

1

您只需就不要在后台线程上创建UI元素。让你的生活更轻松,遵循这个规则。

+0

这就是我所做的。谢谢 –

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个。

+0

获取此错误消息 - 调用线程不能访问此对象,因为不同的线程拥有它。 –

+0

我想知道controller.SummaryDataGrid,它是一个用户控件还是数据? 如果它是一个usercontrol,那么它属于哪个线程? – Thinhbk

+0

SummaryDataGrid是在后台工作线程中创建的DataGrid。它在运行时分配了一个DataTable –

相关问题