gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:19:00 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com