web-dev-qa-db-fra.com

Méthode correcte pour obtenir CoreDispatcher dans une application Windows Store

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?

82
lysergic-acid

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 .

142
MAXE

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
}));
13
Brett Pennings
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal,
            () => { // your code should be here});
3
apramc

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.

0
J. H.