System.Windows.Forms.Application和System.Windows.Application之间的互操作性

时间:2010-07-02 15:45:02

标签: c# .net interop

我必须将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系统来从正确的线程委托该系列的版本?

1 个答案:

答案 0 :(得分:5)

您应该从UI线程(可能在静态属性中)保存对SynchronizationContext.Current的引用,并使用它而不是Dispatcher

在WPF中,这将返回DispatcherSynchronizationContext;在WinForms中,它将返回WindowsFormsSynchronizationContext

然后,您可以在已保存的SynchronizationContext上致电Post,这相当于BeginInvoke