2012-08-16 12 views

cevap

14

Eh, CheckBeginInvokeOnUI (Eylem eylem) otomatik olarak bu durumu ele GalaSoft.MvvmLight.Threading.DispatcherHelper sınıfının yöntemi kullanabilirsiniz.

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



Düzenleme: Aşağıdaki kod MVVM Işığın DispatcherHelper sınıfına dayanmaktadır

Toolkit - link


Ama (bu arada göre oldukça serin bir şeydir ) MVVM Işık kullanmak istemiyorsanız, sen yok, böyle bir şey (bu çalışırsa üzgün, kontrol edemez deneyebilirsiniz Windows 8):

var dispatcher = Window.Current.Dispatcher; 

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


böyle ayrı sınıfta bu mantığı koymak güzel olurdu:

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; 
     } 
    } 
} 


Sonra hoşuna kullanabilirsiniz:

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

Sanırım bu işe yarıyor, ancak herhangi birinin bir üçüncü parti kitaplığı gerektirmeyen bir çözümü bilmesi güzel olurdu. – Nilzor

+0

Yorum yazdım, bir göz atın. – Oleg

+0

Çok teşekkürler. Window.Current.Dispatcher.HasThreadAccess bool anahtar sanırım. – Nilzor

3

Ana kullanıcı arabirimine CoreApplication.Window, ör.

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