Je construis une application Windows Store et j'ai du code à publier sur le fil de l'interface utilisateur.
Pour cela, j'aimerais récupérer le CoreDispatcher et l'utiliser pour poster le code.
Il semble y avoir plusieurs façons de le faire:
// First way
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher;
// Second way
Window.Current.Dispatcher;
Je me demande lequel est correct? ou si les deux sont équivalents?
C'est le moyen préféré:
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
// Your UI update code goes here!
});
L'avantage, c'est qu'il récupère le CoreApplicationView
principal et est donc toujours disponible. Plus de détails ici .
Vous pouvez utiliser deux alternatives.
Première alternative
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher
Cela donne la vue active pour l'application, mais cela vous donnera null, si aucune vue n'a été activée. Plus de détails ici .
Deuxième alternative
Window.Current.Dispatcher
Cette solution ne fonctionnera pas si elle est appelée depuis un autre thread car elle renvoie null à la place de UI Dispatcher. Plus de détails ici .
Pour ceux qui utilisent C++/CX
Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal,
ref new Windows::UI::Core::DispatchedHandler([this]()
{
// do stuff
}));
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
() => { // your code should be here});
En fait, je proposerais quelque chose dans le sens de ceci:
return (Window.Current == null) ?
CoreApplication.MainView.CoreWindow.Dispatcher :
CoreApplication.GetCurrentView().CoreWindow.Dispatcher
De cette façon, si vous avez ouvert une autre vue/fenêtre, les répartiteurs ne seront pas confus ...
Ce petit bijou vérifie s'il y a même une fenêtre. S'il n'y en a pas, utilisez le répartiteur de MainView. S'il y a une vue, utilisez celui-ci Dispatcher.