2016-12-07 1 views
0

Voici quelques-unes des manières d'obtenir le répartiteur de la vue.Obtention du répartiteur d'une fenêtre dans UWP

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher

et

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

Alors que le premier renvoie le répartiteur de la vue principale, et le dernier renvoie le répartiteur de l'actif view, Comment puis-je obtenir le répartiteur d'une vue qui n'est pas active?

Répondre

2

Vous devez disposer d'une référence à la vue à partir de laquelle vous souhaitez accéder au Dispatcher. Si vous créez vous enregistrez en quelque sorte, voir ci-dessous. Vous pouvez également accéder à toutes les vues en appelant ceci:

IReadOnlyList<CoreApplicationView> views = CoreApplication.Views; 

Cependant une vue ne dispose pas d'un identifiant directement accessible, de sorte que vous devez chercher un identifiant en appelant, après le point de vue a été activé dans un répartiteur pour elle :

await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => { 
    Frame frame = new Frame(); 
    frame.Navigate(typeof(SecondaryPage), null); 
    Window.Current.Content = frame; 
    // You have to activate the window in order to show it later. 
    Window.Current.Activate(); 

    newViewId = ApplicationView.GetForCurrentView().Id; 
}); 

alors je suggère de créer votre propre IDictionary<int, CoreApplicationView> d'avoir une correspondance entre ids et votre point de vue. Sinon, vous pouvez également obtenir l'identifiant par

newViewId = ApplicationView.GetApplicationViewIdForWindow(newView.CoreWindow); 

(un peu plus documentation)

1

Après une expérience récente, je suggérerais contre le stockage des références à Dispatchers. Au lieu de cela, comptez sur la page/le contrôle que vous voulez exécuter le code de l'interface utilisateur, car chaque contrôle XAML a son propre CoreDispatcher. De cette façon, vous êtes sûr que vous avez le bon répartiteur et s'il est manquant, c'est un signe que quelque chose ne va pas. Code de xaml source:

namespace Windows.UI.Xaml 
{ 
//Summary: 
//Represents an object that participates in the dependency property system. DependencyObject is the immediate base class of many `enter code here` important UI-related classes, such as UIElement, Geometry, FrameworkTemplate, Style, and ResourceDictionary. 
public class DependencyObject : IDependencyObject, IDependencyObject2 
{ 

    //Summary: 
    //Gets the CoreDispatcher that this object is associated with. The CoreDispatcher represents a facility that can access the DependencyObject on the UI thread even if the code is initiated by a non-UI thread. 
    // Returns: The CoreDispatcher that DependencyObject object is associated with, which represents the UI thread. 
    public CoreDispatcher Dispatcher { get; } 

(...) 

} 
}