2009-08-16 25 views
14

He intentado utilizar los ejemplos de MSDN para esto, pero parecen ser solo aplicables a Windows Forms. Por ejemplo, el método de uso de .InvokeRequired se basa en el control de formularios de Windows, sin embargo, este método no está disponible para los controles de WPF. El método de obrero Backgound lanza una InvalidOperationException así -¿Cómo acceder al control C# WPF de manera segura?

el subproceso de llamada no puede acceder a este objeto porque un subproceso diferente posee ella.

Entonces, ¿cómo se puede hacer esto en el contexto de WPF?

Respuesta

33

Simplemente desea utilizar el método Dispatcher.Invoke (o el equivalente asíncrono Dispatcher.BeginInvoke), que coordinará la llamada al subproceso principal de interfaz de usuario de WPF.

La clase DependencyObject contiene una propiedad Dispatcher, lo que significa que todos los controles y otros objetos que heredan de esta clase también proporcionan esta propiedad, de forma similar a WinForms. Además, el objeto Application proporciona acceso al despachador.

Un ejemplo de uso podría ser la siguiente (en el código subyacente de un Window/UserControl):

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

Gracias, que funcionó a la perfección. En realidad, parece mucho más simple en WPF que en formularios de ganar, cuando sabes lo que tienes que hacer ;-) –

+0

No hay problema. Y sí, WPF ciertamente tiene un mejor modelo de roscado/bomba de mensajes. – Noldorin

Cuestiones relacionadas