2009-05-08 10 views
20

Dans mon contrôle WPF personnalisé, je veux obtenir une fenêtre ou une page contenant. La méthode Window.GetWindow() fonctionne correctement lorsque le contrôle est dans une application fenêtrée, mais lorsqu'elle est dans l'application XBAP dans un navigateur, elle renvoie la fenêtre du navigateur au lieu de la page.Comment obtenir un objet supérieur (fenêtre ou page) dans WPF?

Existe-t-il un autre moyen de le faire?

Répondre

6

Vous pouvez utiliser la classe VisualTreeHelper pour récupérer le contrôle de haut niveau:

DependencyObject GetTopLevelControl(DependencyObject control) 
{ 
    DependencyObject tmp = control; 
    DependencyObject parent = null; 
    while((tmp = VisualTreeHelper.GetParent(tmp)) != null) 
    { 
     parent = tmp; 
    } 
    return parent; 
} 
+2

Hmm ... Je pense que j'ai déjà posté ce commentaire ... Ce n'est pas fonctionne lorsque votre contrôle est dans un modèle. La boucle se termine lorsque vous atteignez le modèle "root". –

26
var parent = VisualTreeHelper.GetParent(this); 
while (!(parent is Page)) 
{ 
    parent = VisualTreeHelper.GetParent(parent); 
} 
(parent as Page).DoStuff(); 
+0

Salut Tomislav Markovski, votre solution est très utile pour trouver le parent le plus élevé, c'est-à-dire Page. Mais la méthode DoStuff() n'a pas pu être appelée. Je reçois une erreur disant « Windows.UI.Xaml.Controls.Page » ne contient pas de définition pour « DoStuff » (vous manque une directive using ou une référence assemply?) J'ai désespérément besoin d'appeler une méthode dans MainPage d'un contrôle dynamique de l'utilisateur et incapable de le faire. Aidez-moi, s'il vous plaît. –

+3

Change 'while (! (Parent is Page))' et '(parent comme Page) .DoStuff();' pour tester et lancer vers votre classe de page. Si c'est MainPage, alors 'parent est MainPage', etc. De toute évidence' DoStuff() 'devrait être le nom de votre fonction. –

0

Je pense que la meilleure façon est

var obj = VisualTreeHelper.GetParent((DependencyObject)Content); 
+1

Cela vous donnera seulement le parent direct. Envisagez si vous avez plusieurs contrôles utilisateur imbriqués dans une fenêtre. – ezolotko

44

Cela fonctionne pour moi:

Window parentWindow = Window.GetWindow(this); 
+0

Un grand merci. Manquant la méthode Page.GetPage ...: S –

Questions connexes