我必须将WPF UI集成到.NET 2.0应用程序中。
需要在GUI Dispatcher线程中修改ObservableCollection,因此我提出了一个涉及InvokeLater()
的解决方案
ObservableCollection<Item> items;
public delegate void AddItemDelegate(Item i);
public void AddItem(Item item)
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(
new AddItemsDelegate(i => items.Add(i), item);
}
但是,由于该项目最初是使用.NET 2.0编写的,因此主线程使用System.Windows.Forms.Application
,因此System.Windows.Application.Current
为空。
我不能只用System.Windows.Forms.Application
替换当前的System.Windows.Application
,因为我的应用程序很大程度上依赖于这个API而且这两个类是广泛不兼容的。
有没有办法获得当前的System.Windows.Application
?或者在BeginInvoke()
上拨打System.Windows.Forms.Application
的方法?或者我是否考虑编写自己的DIY系统来从正确的线程委托该系列的版本?
答案 0 :(得分:5)
您应该从UI线程(可能在静态属性中)保存对SynchronizationContext.Current
的引用,并使用它而不是Dispatcher
。
在WPF中,这将返回DispatcherSynchronizationContext
;在WinForms中,它将返回WindowsFormsSynchronizationContext
。
然后,您可以在已保存的SynchronizationContext
上致电Post
,这相当于BeginInvoke
。