2012-04-23 14 views
29

¿Cómo puedo obtener los controles secundarios del tipo ComboBox en MyContainerGrid en WPF?¿Cómo obtener hijos de un contenedor WPF por tipo?

<Grid x:Name="MyContainer">      
    <Label Content="Name" Name="label1" /> 
    <Label Content="State" Name="label2" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox1"/> 
    <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox3" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox4" /> 
</Grid> 

Esta línea me da un error:

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

Respuesta

63

Este método de extensión buscará recursivamente en busca de elementos secundarios del tipo deseado:

public static T GetChildOfType<T>(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<T>(child); 
     if (result != null) return result; 
    } 
    return null; 
} 

Así que usando eso usted puede pedir MyContainer.GetChildOfType<ComboBox>().

+7

' LogicalTreeHelper.FindLogicalNode (DependencyObject depObj, string elementName) 'trabajado para mí para lograr el mismo objetivo. – Paul

+0

Use this one http://stackoverflow.com/a/978352/690656 – Andreas

32

Niños es una colección de UiElements. Por lo tanto, necesita repetir los elementos y determinar para cada elemento si es del tipo requerido. Afortunadamente, ya existe un método de LINQ para exactamente esto, es decir, Enumerable.OfType<T>, que convenientemente se puede llamar usando Extension Method sintaxis:

var comboBoxes = this.MyContainer.Children.OfType<ComboBox>(); 

Este método filtra la colección en función de su tipo y vuelve, en su caso, sólo los elementos del tipo ComboBox.

Si sólo desea que el primer cuadro combinado (como su nombre de variable podría sugerir), sólo puede añadir una llamada a FirstOrDefault() a la consulta:

var myComboBox = this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault(); 
+0

funciona bien. Gracias – ArchieTiger

+1

Esto no buscará en 'ContentControl –

2

búsqueda para el primer hijo de un cierto tipo que incluye un punto (de la pantalla) predeterminada:

(parámetro 'punto' es el resultado de llamar a la función 'PointToScreen' (declarado en el tipo visual))

private TDescendantType FindDescendant<TDescendantType>(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<TDescendantType>(child, screenPoint); 
     if (child != null) 
     { 
      return (TDescendantType)child; 
     } 
    } 
    return null; 
} 
+0

Por favor [edite] con más información. Las respuestas de solo código y "prueba esto" están [desaconsejadas] (// meta.stackexchange.com/questions/196187), ya que no contienen contenido que se pueda buscar y no explican por qué alguien debe "probar esto". Hacemos un esfuerzo aquí para ser un recurso para el conocimiento. – Mogsdad

Cuestiones relacionadas