WPF – Encontrar Ascendientes y Descendientes en el Arbol visual
Vaya titulito, y es que no sabia como llamarle así que me he decidido por un titulo largo, al grano este post viene derivado de una pregunta de los foros, la pregunta resumida era como recorrerse el árbol visual de elementos de WPF(algo que ya hemos explicado) para encontrar el padre de un tipo determinado que tiene un objeto.
Por ejemplo coger la instancia de la ventana que ha instanciado mi UserControl, esto seria posible con la siguiente función
public static T FindAncestorOrSelf<T>(DependencyObject obj) where T : DependencyObject
{
while (obj != null)
{
T objTest = obj as T;
if (objTest != null) return objTest;
obj = VisualTreeHelper.GetParent(obj);
}
return null;
}
y su llamada seria
window = Helper.FindAncestorOrSelf<Window>(this);
Como veis me recorro con la función VisualTreeHelper.GetParent el padre del objeto y así voy subiendo sobre el árbol visual hasta encontrar un objeto de tipo Window.
Y para los descendientes sería
public Visual GetDescendantByType(Visual element, Type type)
{
if (element == null) return null;
if (element.GetType() == type) return element;
Visual foundElement = null;
if (element is FrameworkElement)
{
(element as FrameworkElement).ApplyTemplate();
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
foundElement = GetDescendantByType(visual, type);
if (foundElement != null)
break;
}
return foundElement;
}
En el siguiente post la utilizaremos