2009-08-16 27 views
14

Tôi đã thử sử dụng các ví dụ từ MSDN cho điều này nhưng chúng dường như chỉ áp dụng cho Windows Forms. Ví dụ, phương thức sử dụng .InvokeRequired dựa vào các điều khiển biểu mẫu windows, tuy nhiên phương thức này không có sẵn cho các điều khiển WPF. Phương pháp nhân backgound ném một InvalidOperationException cũng -Làm thế nào để truy cập điều khiển WPF C# trong thread an toàn?

các thread gọi không thể truy cập đối tượng này vì một thread khác nhau sở hữu nó.

Vậy làm thế nào điều này có thể được thực hiện trong ngữ cảnh của WPF?

Trả lời

33

Bạn chỉ muốn sử dụng phương thức Dispatcher.Invoke (hoặc không đồng bộ tương đương Dispatcher.BeginInvoke), sẽ sắp xếp cuộc gọi đến chuỗi giao diện người dùng WPF chính.

Lớp DependencyObject chứa thuộc tính Dispatcher, có nghĩa là tất cả các điều khiển và các đối tượng khác kế thừa từ lớp này cũng cung cấp thuộc tính này theo cách tương tự như WinForms. Ngoài ra, đối tượng Application cung cấp quyền truy cập vào điều phối viên.

Một cách sử dụng ví dụ có thể là như sau (trong code-behind của một Window/UserControl):

this.Dispatcher.Invoke((Action)(() => 
    { 
     ... 
    })); 
+0

Cảm ơn, mà làm việc một cách hoàn hảo. Nó thực sự trông đơn giản hơn rất nhiều trong WPF so với hình thức giành chiến thắng, khi bạn biết những gì bạn cần làm ;-) –

+0

Không có vấn đề gì. Và vâng WPF chắc chắn có một mô hình bơm luồng/tin nhắn tốt hơn. – Noldorin

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