2012-08-16 8 views

Respuesta

14

Bueno, si utiliza MVVM Light Toolkit en su aplicación, se puede utilizar CheckBeginInvokeOnUI (acción Acción) método de GalaSoft.MvvmLight.Threading.DispatcherHelper clase que maneja esta situación de forma automática.

GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => 
{ 
    Gui.Property = SomeNewValue; 
}); 



Editar:

El siguiente código se basa en DispatcherHelper clase de MVVM Light Toolkit - link


Pero si no desea usar MVVM Light (que es cosa muy bien por cierto), puede intentar algo como esto (lo siento, no se puede comprobar si esto funciona, no tienen windows 8):

var dispatcher = Window.Current.Dispatcher; 

if (dispatcher.HasThreadAccess) 
    UIUpdateMethod(); 
else dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => UIUpdateMethod();); 


sería más agradable para poner esta lógica en clase separada de esta manera:

using System; 
using Windows.UI.Core; 
using Windows.UI.Xaml; 

namespace MyProject.Threading 
{ 
    public static class DispatcherHelper 
    { 
     public static CoreDispatcher UIDispatcher { get; private set; } 

     public static void CheckBeginInvokeOnUI(Action action) 
     { 
      if (UIDispatcher.HasThreadAccess) 
       action(); 
      else UIDispatcher.RunAsync(CoreDispatcherPriority.Normal, 
             () => action()); 
     } 

     static DispatcherHelper() 
     { 
      if (UIDispatcher != null) 
       return; 
      else UIDispatcher = Window.Current.Dispatcher; 
     } 
    } 
} 


a continuación, puede usarla como:

DispatherHelper.CheckBeginInvokeOnUI(() => UIUpdateMethod()); 
+2

Supongo que esto funciona, pero sería bueno que alguien supiera de una solución que no requiere una biblioteca de terceros. – Nilzor

+0

He editado el comentario, compruébalo. – Oleg

+0

Muchas gracias. Supongo que el Window.Current.Dispatcher.HasThreadAccess bool es la clave. – Nilzor

3

Puede acceder al hilo principal de la interfaz de usuario a través de CoreApplication.Window, p.

if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess) 
      { 
       DoStuff(); 
      } 
      else 
      { 
       await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
       { 
        DoStuff(); 
       }); 
      } 
Cuestiones relacionadas