Nun, wenn Sie MVVM Light Toolkit in Ihrer Anwendung verwenden, können Sie CheckBeginInvokeOnUI (Aktion Aktion) Methode der GalaSoft.MvvmLight.Threading.DispatcherHelper Klasse verwenden, die automatisch diese Situation behandelt.
GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Gui.Property = SomeNewValue;
});
Edit:
Der folgende Code basiert auf DispatcherHelper Klasse von MVVM Light Toolkit - link
Aber wenn Sie nicht MVVM Light (die die übrigens ziemlich coole Sache ist) verwenden möchten, können Sie so etwas wie dieses (sorry versuchen, kann nicht überprüfen, ob das funktioniert, müssen nicht Windows 8):
var dispatcher = Window.Current.Dispatcher;
if (dispatcher.HasThreadAccess)
UIUpdateMethod();
else dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => UIUpdateMethod(););
es wäre schöner, diese Logik in separate Klasse setzen wie folgt aus:
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;
}
}
}
Dann können Sie es gerne verwenden:
DispatherHelper.CheckBeginInvokeOnUI(() => UIUpdateMethod());
Ich denke, das funktioniert, aber es wäre nett, wenn jemand eine Lösung kennt, die keine Bibliothek von Drittanbietern erfordert. – Nilzor
Ich habe Kommentar bearbeitet, schau es dir an. – Oleg
Vielen Dank. Ich denke, die Window.Current.Dispatcher.HasThreadAccess bool ist der Schlüssel. – Nilzor