- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须将 WPF UI 集成到 .NET 2.0 应用程序中。
ObservableCollection 需要在 GUI Dispatcher 线程中修改,所以我想出了一个涉及 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.Application
替换当前的 System.Windows.Forms.Application
因为我的应用程序严重依赖这个 API 和两个类是广泛不兼容的。
有没有办法获取当前的 System.Windows.Application
?或者在我的 System.Windows.Forms.Application
上调用 BeginInvoke()
的方法?或者我是否被视为编写自己的 DIY 系统以从正确的线程委托(delegate)版本集?
最佳答案
您应该从 UI 线程(可能在静态属性中)保存对 SynchronizationContext.Current
的引用,并使用它代替 Dispatcher
。
在 WPF 中,这将返回 DispatcherSynchronizationContext
;在 WinForms 中,它将返回 WindowsFormsSynchronizationContext
.
然后您可以调用 Post
在保存的 SynchronizationContext
上,相当于 BeginInvoke
。
关于c# - System.Windows.Forms.Application 和 System.Windows.Application 之间的互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167171/
我是一名优秀的程序员,十分优秀!