2009-05-08 7 views
20

Dentro de mi control WPF personalizado, quiero obtener una Ventana o Página que lo contenga. El método Window.GetWindow() funciona bien cuando el control está en una aplicación de ventana, pero cuando está en la aplicación XBAP en un navegador, devuelve la ventana del navegador en lugar de la página.¿Cómo obtener un objeto superior (ventana o página) en WPF?

¿Hay alguna otra manera de hacerlo?

Respuesta

6

Puede utilizar la clase VisualTreeHelper para recuperar el control de nivel superior:

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

Hmm ... Creo que ya publiqué este comentario ... Esto no trabaja cuando tu control está en una Plantilla. El ciclo finaliza cuando llega a la plantilla "raíz". –

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

Hola Tomislav Markovski, tu solución es muy útil para encontrar el padre superior, es decir, Page. Pero el método DoStuff() no pudo ser llamado. Recibo un error que dice 'Windows.UI.Xaml.Controls.Page' no contiene una definición para 'DoStuff' (¿falta una directiva using o una referencia assemply?) Necesito desesperadamente llamar a un método en MainPage desde un control dinámico del usuario y no puede hacer esto. Ayuda por favor. –

+3

Cambia 'while (! (Parent es Page))' y '(parent as Page) .DoStuff();' para probar y convertir a tu clase de página. Si eso es MainPage, entonces 'parent es MainPage', etc. Obviamente' DoStuff() 'debería ser el nombre de tu función. –

0

Creo que la mejor manera es

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

Esto solo le dará el padre directo. Considere si tiene múltiples controles de usuario anidados en una ventana. – ezolotko

44

Esto funciona para mí:

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

Muchas gracias. Falta el método Page.GetPage ...: S –

Cuestiones relacionadas