2010-07-02 38 views
5

Tôi phải tích hợp giao diện người dùng WPF vào ứng dụng .NET 2.0.Khả năng tương tác giữa System.Windows.Forms.Application và System.Windows.Application

ObservableCollection cần phải được sửa đổi trong thread GUI Dispatcher, vì vậy tôi đã đưa ra một giải pháp liên quan đến 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); 
} 

Tuy nhiên, kể từ khi dự án được ban đầu được viết với .NET 2.0, các chủ đề chính sử dụng một System.Windows.Forms.Application , vì vậy System.Windows.Application.Current là không.

Tôi không thể thay thế System.Windows.Forms.Application hiện tại bằng System.Windows.Application vì ứng dụng của tôi phụ thuộc rất nhiều vào API này và hai lớp không tương thích rộng rãi.

Có cách nào để lấy số System.Windows.Application hiện tại không? Hoặc một cách để gọi BeginInvoke() trên số System.Windows.Forms.Application của tôi? Hay tôi được coi là viết hệ thống DIY của riêng tôi để ủy quyền ấn bản bộ sưu tập từ chủ đề chính xác?

Trả lời

5

Bạn nên lưu tham chiếu đến SynchronizationContext.Current từ chuỗi giao diện người dùng (có thể trong thuộc tính tĩnh) và sử dụng nó thay vì Dispatcher.

Trong WPF, điều này sẽ trả lại DispatcherSynchronizationContext; trong WinForms, nó sẽ trả về một WindowsFormsSynchronizationContext.

Sau đó, bạn có thể gọi Post trên số đã lưu SynchronizationContext, tương đương với BeginInvoke.

Các vấn đề liên quan