2010-03-17 13 views
5

Trong constructor của một đối tượng tôi cần phải tạo ra một đối tượng WPF MediaElement:Lấy WPF phối ngay trong một sợi

m_videoMedia = new MediaElement(); 

nhưng lớp cũng có thể được khởi tạo từ một thread khác vì vậy tôi cần phải sử dụng

Dispatcher.Invoke(DispatcherPriority.Normal, 
    (Action)(() => { m_videoMedia = new MediaElement(); })); 

Nhưng làm thế nào tôi có thể lấy ví dụ phối ngay trong constructor rằng: s

Trả lời

8

Bạn hầu như chỉ có thể sử dụng Dispatcher.CurrentDispatcher .Invoke ...

Tuy nhiên, nếu vì một số lý do không hoạt động, bạn có thể yêu cầu lớp của bạn nhận được một tham chiếu đến Dispatcher như một phần của hàm tạo của nó. Chỉ cần vượt qua trong Dispatcher.CurrentDispatcher từ chuỗi giao diện người dùng tại thời điểm xây dựng.

+8

Theo msdn, điều này sẽ trả về bộ điều phối liên quan đến chuỗi hiện tại và sẽ tạo một bộ điều phối mới chưa được tạo. Điều này không có vẻ giống như một cái gì đó bạn muốn làm trong trường hợp này. Bạn sẽ cần người điều phối được liên kết với giao diện người dùng. Hoặc cụ thể hơn là điều phối viên của một cửa sổ cụ thể. –

+0

+1 để chuyển tham chiếu tới điều phối hiện tại. – Nate

+0

Tĩnh Dispatcher.CurrentDispatcher đã không làm việc cho tôi trong một kịch bản tương tự. Tôi đã thử Application.Current.Dispatcher như được gợi ý bởi sinelaw - đã hoạt động. –

2

Hầu hết các điều khiển WPF lấy được từ DispatcherObject có thuộc tính Bộ điều phối bạn cần. Vì vậy, về cơ bản bạn sẽ sử dụng điều phối từ điều khiển bạn muốn sử dụng. Trong trường hợp này, ví dụ, cửa sổ nơi MediaElement được thêm vào.

-1

Nếu bạn thêm tham chiếu đến System.Windows.Forms vào dự án của mình, bạn có thể tiếp tục sử dụng Application.DoEvents() trong WPF.

5

As explained in this answer:

Bạn có thể lấy các UI Dispatcher từ dụ ứng dụng tĩnh: Application.Current.Dispatcher

Bạn có thể muốn kiểm tra Application.Current for null đầu tiên, vì nó có thể xóa trong một chuỗi shutdown .

Ngoài ra, here are the docs cho lớp Ứng dụng.