2009-08-16 11 views
14

Próbowałem użyć przykładów z MSDN do tego, ale wydaje się, że dotyczą tylko Windows Forms. Na przykład metoda użycia .InvokeRequired opiera się na kontroli formularzy okien, jednak ta metoda nie jest dostępna dla formantów WPF. Metoda pracownik Backgound zgłasza InvalidOperationException, jak również -Jak uzyskać dostęp do kontrolki C# WPF w sposób bezpieczny dla wątków?

Wątek wywołujący nie ma dostępu do tego obiektu, ponieważ inny wątek jest właścicielem to.

Jak można tego dokonać w kontekście WPF?

Odpowiedz

33

Po prostu chcesz użyć metody Dispatcher.Invoke (lub asynchronicznego odpowiednika Dispatcher.BeginInvoke), która przekaże połączenie do głównego wątku interfejsu użytkownika WPF.

Klasa zawiera właściwość , co oznacza, że ​​wszystkie elementy sterujące i inne obiekty, które dziedziczą z tej klasy, również zapewniają tę właściwość w sposób podobny do WinForm. Ponadto obiekt Application zapewnia dostęp do modułu rozsyłającego.

Przykładem użycia może być następujące (w kodzie opóźnieniem z Window/UserControl):

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

Dzięki, że pracował idealnie. W WPF wygląda to o wiele prostiej niż formularze wygranych, kiedy wiesz, co musisz zrobić ;-) –

+0

Nie ma problemu. I tak, WPF z pewnością ma lepszy model pompowania wątków/wiadomości. – Noldorin

Powiązane problemy