2009-09-24 9 views
9

así que tengo este UserControl que está dentro de otro UserControl. Vamos a llamarlos ParentUC y ChildUC. Necesito obtener ParentUC de ChildUC.WPF Obtiene el propietario de UserControl

Sé que para obtener el propietario de la ventana sería Window.GetWindow(userControl), pero UserControl no tiene un método como este AFAIK.

¡Gracias por la ayuda!

Respuesta

14

Se me ocurrió esta solución, pero publique si tiene una mejor. ¡Gracias!

DependencyObject ucParent = this.Parent; 

while (!(ucParent is UserControl)) 
{ 
    ucParent = LogicalTreeHelper.GetParent(ucParent); 
} 
0

Siempre puede usar VisualTreeHelper.GetParent(child) para devolver el elemento primario en el árbol visual (el control de usuario principal desde un control de usuario anidado).

+0

Lo hice pero obtiene la cuadrícula que contiene el control, esa es la razón por la que tuve que realizar un bucle hasta que obtiene el primer UserControl en el árbol lógico. Y creo que es mejor usar el LogicalTreeHelper para que el bucle no entre en las plantillas, adornos, etc. Gracias por la sugerencia. – Carlo

0

UserControl tiene una propiedad .Parent que debe darle acceso a su padre.

Luego puede convertirlo a su objeto ParentUC.

+0

Sí, el problema es que el UserControl podría estar dentro de un StackPanel, que está dentro de un Grid, que está dentro del UserControl principal, en cuyo caso myUserControl.Parent será un StackPanel, myUserControl.Parent.Parent sería un Grid, y finalmente myUserControl.Parent.Parent.Parent (lol, por supuesto, esto se simplifica al no enviar el elemento primario a StackPanel o Grid) sería el UserControl. Es por eso que uso el ciclo para obtener el primer UserControl que se encuentra encima del secundario. – Carlo

+0

Haha, vi la solución que había publicado (sin darme cuenta de que también había hecho la pregunta) y desde que apareció la pregunta (para mí) para indicar que ChildUC era un hijo directo de ParentUC, quería brindarle una respuesta más simple. responder. Dada la información adicional para su escenario, creo que la solución que surgió es lo que debe hacer. – Scott

+0

Sí, parece que sí. En algún lugar que leo eso es lo que hace Window.GetWindow (UIElement), así que supongo que esa es la mejor opción. ¡Gracias por la sugerencia! – Carlo

Cuestiones relacionadas