Bonne façon d'obtenir le CoreDispatcher dans une application Windows Store

je suis en train de construire une application Windows Store, et j'ai un code qui doit être posté sur le thread de L'interface utilisateur.

pour ça, j'aimerais récupérer le régulateur de vitesse et l'utiliser pour afficher le code.

il semble qu'Il ya quelques façons de le faire:

// First way
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher;

// Second way
Window.Current.Dispatcher;

je me demande laquelle est correcte? ou si les deux sont équivalents?

75
demandé sur lysergic-acid 2013-05-10 11:24:15

4 réponses

C'est la méthode préférée:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
    // Your UI update code goes here!
});

L'avantage c'est que ça devient le principal CoreApplicationView et est donc toujours disponible. Plus de détails ici .

il y a deux alternatives que vous pouvez utiliser.

première alternative

Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher

cela obtient 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 variante

Window.Current.Dispatcher

Cette solution ne fonctionnera pas quand elle est appelée à partir d'un autre thread car elle retourne null au lieu du UCI Dispatcher . Plus de détails ici .

127
répondu MAXE 2016-11-17 07:08:25

pour toute personne utilisant C++ / CX

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([this]()
{
    // do stuff
}));
12
répondu Brett Pennings 2018-05-02 02:42:46
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal,
            () => { // your code should be here});
3
répondu apramc 2015-06-08 23:10:54

en fait, je proposerais quelque chose dans la ligne 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, vous n'obtiendrez pas les répartiteurs confus...

ce petit bijou vérifie s'il y a même une fenêtre. Si aucun, utilisez le répartiteur de MainView. S'il y a une vue, utilisez son répartiteur.

0
répondu J. H. 2017-07-11 14:01:49