0
我有一个工作应用程序,向网格添加新的RibbonTab和新的子控件。wpf后台线程更新UI控制
我想提出这个动作在后台线程的子控件可能需要一段时间从数据库中收集数据等
我有下面的代码至今:
Ribbon Ribbon_Main = new Ribbon();
Grid Grid_Main = new Grid();
Thread newthread2 = new Thread(new ThreadStart(delegate { Graphing_Template.add_report(); }));
newthread2.SetApartmentState(ApartmentState.STA); //Is this required?
newthread2.Start();
Class Graphing_Template()
{
static void add_report()
{
RibbonTab rt1 = new RibbonTab();
MainWindow.Ribbon_Main.Items.Add(rt1);
// Create control with information from Database, etc.
// add control to MainWindow.Grid_Main
}
}
我想要在后台创建新的报表控件,并在准备就绪时将其添加到主UI。
我去解决的办法是:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
DataTable dt1 = new DataTable();
---- Fill DataTable with
args.Result = datagrid_adventureworks_DT();
};
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
DataTable dt1 = (DataTable)args.Result;
Datagrid_Main.ItemsSource = dt1.AsDataView();
};
作为一般规则,除非你是在UI线程不要触摸UI对象。当然,在后台线程中做一些咕噜的工作,然后通过调度程序将UI更新编组到UI线程。 – Cameron
我可以生成两个子对象,然后将它们传递回UI线程? – user3329538
我不知道WPF给出了一个明确的答案,对不起。我怀疑它会起作用,但我知道它不会用winforms,例如,因为Win32 UI对象只能由创建它们的线程触及(WPF不使用Win32 UI对象来实现像按钮,等等。)。 – Cameron