2009-11-23 12 views
7

Estoy buscando un método confiable para construir una lista de controles de < Tipo> contenido en un panel < específico> control derivado - esto incluye aquellos que son hijos directos, y aquellos que son hijos de niños, etc.Silverlight: Encuentre todos los controles de tipo en diseño

La manera más obvia era que sólo lo hacen de forma recursiva:
añadir a la lista de hijos de este control < tipo>, a continuación, repita la función para cualquier niño de este control que es una < Panel> o descendiente.

Sin embargo, me preocupa que no encuentre todos los controles en el árbol; ContentControl también podría contener un control de < Tipo>, al igual que HeaderedContentControl o cualquier otro control similar con uno o más atributos secundarios/de contenido .

¿Hay algún medio de ejecutar una búsqueda contra el árbol de diseño real, de modo que cualquier instancia de de un tipo específico de control contenido sin un elemento primario específico se pueda encontrar?

Respuesta

20

Aquí es un método de extensión bastante ingenua: -

public static class VisualTreeEnumeration 
{ 
    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) 
    { 
    int count = VisualTreeHelper.GetChildrenCount(root); 
    for (int i=0; i < count; i++) 
    { 
     var child = VisualTreeHelper.GetChild(root, i); 
     yield return child; 
     foreach (var descendent in Descendents(child)) 
     yield return descendent; 
    } 
    } 
} 

Este enfoque tiene la retirare que supone que no hay cambios ocurren en el número de miembros del árbol, mientras que su en curso. Esto podría mitigarse en uso mediante el uso de una ToList().

Ahora se puede efectuar sus necesidades utilizando LINQ: -

var qryAllButtons = myPanel.Descendents().OfType<Button>(); 
+0

Sí, funciona muy bien. Gracias. – Jonx

+0

@AnthonyWJones cuando uso Descendents no se retrotará ningún control para mí, soy trace y VisualTreeHelper.GetChildrenCount (root) devolverá 0 count, ¿por qué? –

1

Digamos que usted quiere encontrar cuadros combinados dentro de un control de usuario que se inicia con una rejilla y ha anidado comboboxes rejillas, stackpanels, lona, ​​etc. que contienen

  1. Imports System.Windows.Controls.Primitives (o el uso de para C#)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

Eso es todo ...

+0

'GetVisualDescendants' no está en la distribución principal de Silverlight AFAICT. (Tenga en cuenta que no hay una definición simple en [MSDN] (http://google.com/search?q=GetVisualDescendants+site%3Amsdn.microsoft.com+site-site%3Asocial.msdn.microsoft.com).) 'System.Windows.Controls .Toolkit' [parece] (http://stackoverflow.com/a/7442356/256431) ser requerido. –

+0

System.Windows.Controls.Primitives es una parte de System.Windows.Controls en el siguiente directorio: c: \ Archivos de programa (x86) \ Microsoft SDKs \ Silverlight \ v5.0 \ Libraries \ Client \ System.Windows.Controls. dll. –

Cuestiones relacionadas