2010-07-02 3 views
5

Мне нужно интегрировать интерфейс WPF в приложение .NET 2.0.Взаимодействие между System.Windows.Forms.Application и System.Windows.Application

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 - null.

Я не могу просто заменить текущий System.Windows.Forms.ApplicationSystem.Windows.Application, так как мое приложение сильно полагается на этот API, и два класса являются несовместимыми.

Есть ли способ получить текущий System.Windows.Application? Или способ позвонить BeginInvoke() на моем System.Windows.Forms.Application? Или я считаю, что написал свою собственную систему DIY для делегирования издания коллекции из правильной темы?

ответ

5

Вы должны сохранить ссылку на SynchronizationContext.Current из потока пользовательского интерфейса (возможно, в статическом свойстве) и использовать его вместо Dispatcher.

В WPF это вернет DispatcherSynchronizationContext; в WinForms он вернет WindowsFormsSynchronizationContext.

Вы можете позвонить по телефону Post по сохраненному SynchronizationContext, что эквивалентно BeginInvoke.

Смежные вопросы