Я должен интегрировать 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 для делегирования выпуска набора от корректного потока?
Следует сохранить ссылку на SynchronizationContext.Current
из потока пользовательского интерфейса (возможно, в статическом свойстве) и использовать ее вместо Dispatcher
.
В WPF это вернет DispatcherSynchronizationContext
; в WinForms он вернет WindowsFormsSynchronizationContext
.
Затем можно вызвать Post
в сохраненном SynchronizationContext
, что эквивалентно BeginInvoke
.