2010-07-02 5 views
5

WPF UI를 .NET 2.0 응용 프로그램에 통합해야합니다.System.Windows.Forms.Application과 System.Windows.Application 간의 상호 운용성

ObservableCollection에이 GUI 디스패처 스레드에서 수정해야합니다, 그래서 프로젝트가 원래 .NET 2.0로 기록 된 이후, 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); 
} 

그러나 관련된 솔루션을 함께했다 메인 스레드는 System.Windows.Forms.Application를 사용 그래서 System.Windows.Application.Current은 null입니다.

System.Windows.Forms.ApplicationSystem.Windows.Application으로 바꿀 수는 없습니다. 내 애플리케이션이이 API를 많이 사용하고 있으며 두 클래스가 널리 호환되지 않기 때문입니다.

현재 가지고있는 방법이 있습니까 System.Windows.Application? 또는 내 System.Windows.Forms.ApplicationBeginInvoke()으로 전화하는 방법은 무엇입니까? 또는 올바른 스레드에서 컬렉션의 버전을 위임하기 위해 내 자신의 DIY 시스템을 작성한 것으로 간주됩니까?

답변

5

UI 스레드 (아마도 정적 속성)에서 SynchronizationContext.Current에 대한 참조를 저장하고 Dispatcher 대신 사용해야합니다.

WPF에서는 DispatcherSynchronizationContext을 반환합니다. WinForms에서 WindowsFormsSynchronizationContext을 반환합니다.

그러면 SynchronizationContextPost을 호출 할 수 있습니다. 이는 BeginInvoke과 같습니다.