2010-07-02 10 views
5

Ich muss eine WPF-Benutzeroberfläche in eine .NET 2.0-Anwendung integrieren.Interoperabilität zwischen System.Windows.Forms.Application und System.Windows.Application

ObservableCollection in dem GUI-Dispatcher-Thread geändert werden muss, so kam ich mit einer Lösung bis 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); 
} 

jedoch beteiligt, da das Projekt ursprünglich mit .NET 2.0, verwendet das Hauptthread ein System.Windows.Forms.Application geschrieben wurde , also System.Windows.Application.Current ist null.

Ich kann nicht einfach die aktuelle System.Windows.Forms.Application durch eine System.Windows.Application ersetzen, da meine Anwendung stark auf diese API angewiesen ist und die beiden Klassen weitgehend inkompatibel sind.

Gibt es eine Möglichkeit, die aktuelle System.Windows.Application zu bekommen? Oder eine Möglichkeit, BeginInvoke() auf meinem System.Windows.Forms.Application anrufen? Oder soll ich mein eigenes DIY-System schreiben, um die Edition der Kollektion aus dem richtigen Thread zu delegieren?

Antwort

5

Sie sollten einen Verweis auf SynchronizationContext.Current aus dem UI-Thread (vielleicht in einer statischen Eigenschaft) speichern und es anstelle der verwenden.

In WPF wird DispatcherSynchronizationContext zurückgegeben; In WinForms gibt es eine WindowsFormsSynchronizationContext zurück.

Sie können dann Post auf dem gespeicherten SynchronizationContext anrufen, was BeginInvoke entspricht.

Verwandte Themen