2009-05-08 8 views
20

All'interno del controllo WPF personalizzato desidero ottenere una finestra o una pagina contenente. Il metodo Window.GetWindow() funziona correttamente quando il controllo si trova in un'app con finestre, ma quando si trova nell'app XBAP in un browser restituisce la finestra del browser anziché la pagina.Come ottenere un oggetto superiore (Finestra o Pagina) in WPF?

C'è un altro modo per farlo?

risposta

6

È possibile utilizzare la classe VisualTreeHelper per recuperare il controllo di livello superiore:

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

Hmm ... Penso di aver già postato questo commento ... Questo no lavora quando il tuo controllo è in un modello. Il ciclo termina quando si raggiunge il modello "root". –

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

Ciao Tomislav Markovski, la tua soluzione è molto utile per trovare il genitore più in alto, la pagina. Ma il metodo DoStuff() non può essere chiamato. Ottengo l'errore dicendo "Windows.UI.Xaml.Controls.Page" non contiene una definizione per "DoStuff" (ti manca una direttiva using o un riferimento assemply?) Ho un disperato bisogno di chiamare un metodo in MainPage da un controllo utente dinamico e incapace di farlo. Aiuto per favore. –

+3

Cambia 'mentre (! (Parent è pagina))' e '(padre come pagina) .DoStuff();' per testare e trasmettere alla classe della pagina. Se quello è MainPage, quindi 'parent è MainPage' ecc. Ovviamente' DoStuff() 'dovrebbe essere il nome della tua funzione. –

0

penso modo migliore è

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

Questo ti darà solo il genitore diretto. Considera se hai più controlli utente annidati in una finestra. – ezolotko

44

Questo funziona per me:

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

Grazie mille. Manca il metodo Page.GetPage ...: S –

Problemi correlati