Взаимодействие между System.Windows.Forms.Application и System.Windows.Application - PullRequest
5 голосов
/ 02 июля 2010

Мне нужно интегрировать пользовательский интерфейс WPF в приложение .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 имеет значение null.

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

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

1 Ответ

5 голосов
/ 02 июля 2010

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

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

Затем вы можете вызвать Post для сохраненного SynchronizationContext, что эквивалентно BeginInvoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...