Совместимость между системой. Windows. Формы. Приложение и система. Windows. Приложение

Я должен интегрировать UI 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, основной поток использует a System.Windows.Forms.Application, так System.Windows.Application.Current является пустым.

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

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

5
задан slaphappy 2 July 2010 в 15:45
поделиться

1 ответ

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

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

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

5
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: