代码之家  ›  专栏  ›  技术社区  ›  slaphappy

system.windows.forms.application和system.windows.application之间的互操作性

  •  5
  • slaphappy  · 技术社区  · 14 年前

    我必须将WPF UI集成到.NET 2.0应用程序中。

    ObservableCollection需要在GUI调度器线程中进行修改,因此我提出了一个涉及 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.应用程序 用一个 System.Windows.Application 因为我的应用程序严重依赖于这个API,所以这两个类是广泛不兼容的。

    有办法得到电流吗 system.windows.应用程序 ?或者一种打电话的方式 BeginInvoke() 在我身上 system.windows.forms.应用程序 ?或者我被认为写了自己的DIY系统来从正确的线程委托集合的版本?

    1 回复  |  直到 14 年前
        1
  •  5
  •   SLaks    14 年前

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

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

    然后你可以打电话 Post 获救 SynchronizationContext ,相当于 BeginInvoke .