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

标签 c# .net interop

我必须将 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/

相关文章:

c# - 根据属性和重复总和列出不同的条目

c# - 我的 Entity Framework 存储库和服务层方法应返回哪些类型的 : List, IEnumerable、IQueryable?

c# - 如何在 C# Windows 应用程序中将数据表导出到 Excel

c# - 通过代码创建一个新的 OneNote 页面

c# - 如何在c#中使用C dll头文件库

c# - 请求被中止 : The connection was closed unexpectedly

c# - 如何修复 IIS 上的 ASP.Net Core 404 错误?

.net - SQLServerCE 来自 .NET 的参数化查询的问题

c-fortran 互操作性 - 带指针的派生类型

c# - C# 和 VBA 之间的通信