Como obter filhos de um contêiner WPF por tipo?

Como posso obter os controles filho do tipo ComboBox no MyContainer Grid no WPF?

   

Esta linha me dá um erro:

 var myCombobox = this.MyContainer.Children.GetType(ComboBox); 

    Este método de extensão pesquisará recursivamente por elementos filho do tipo desejado:

     public static T GetChildOfType(this DependencyObject depObj) where T : DependencyObject { if (depObj == null) return null; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { var child = VisualTreeHelper.GetChild(depObj, i); var result = (child as T) ?? GetChildOfType(child); if (result != null) return result; } return null; } 

    Então, usando isso, você pode pedir MyContainer.GetChildOfType() .

    Crianças é uma coleção de UIElements. Então você precisa iterar sobre os itens e determinar para cada item se é do tipo requerido. Felizmente, já existe um método Linq exatamente para isso, ou seja, Enumerable.OfType , que você pode chamar convenientemente usando a syntax do método de extensão :

     var comboBoxes = this.MyContainer.Children.OfType(); 

    Esse método filtra a coleção com base em seu tipo e retorna, no seu caso, apenas os elementos do tipo ComboBox .

    Se você deseja apenas a primeira ComboBox (como o nome da variável pode sugerir), basta append uma chamada a FirstOrDefault() à consulta:

     var myComboBox = this.MyContainer.Children.OfType().FirstOrDefault(); 

    Procure o primeiro filho de um determinado tipo que inclua um ponto predeterminado (da canvas):

    (param ‘point’ é o resultado da chamada da function ‘PointToScreen’ (declarada no tipo Visual))

     private TDescendantType FindDescendant(DependencyObject parent, Point screenPoint) where TDescendantType : DependencyObject { int count = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is Visual) { Point point = ((Visual)child).PointFromScreen(screenPoint); Rect rect = VisualTreeHelper.GetDescendantBounds((Visual)child); if (!rect.Contains(point)) continue; } if (child is TDescendantType) { return (TDescendantType)child; } child = FindDescendant(child, screenPoint); if (child != null) { return (TDescendantType)child; } } return null; } 

    Todas essas respostas são muito boas, mas, se você está tentando encontrar um filho visual específico do tipo T, ou você está preso em todas elas e, em seguida, encontrando o que você quer, ou esperando que o primeiro seja o um que você quer. Eu mesclei algumas abordagens para encontrar uma específica baseada em um critério. É um pouco como o LINQ, mas eu não queria tentar lidar com um enumerador recursivo.

    Use assim:

     MyContainer.FirstOrDefaultChild 

    Eu escrevi como um método de extensão.

     public static class DependencyObjectExtensions { public static T FirstOrDefaultChild(this DependencyObject parent, Func selector) where T : DependencyObject { T foundChild; return FirstOrDefaultVisualChildWhere(parent, selector, out foundChild) ? foundChild : default(T); } private static bool FirstOrDefaultVisualChildWhere(DependencyObject parent, Func selector, out T foundChild) where T : DependencyObject { var count = VisualTreeHelper.GetChildrenCount(parent); for (var i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(parent, i); var tChild = child as T; if (tChild != null) { if (!selector(tChild)) continue; foundChild = tChild; return true; } if (FirstOrDefaultVisualChildWhere(child, selector, out foundChild)) { return true; } } foundChild = default(T); return false; }