2010-06-28 5 views
0

Est-ce que quelqu'un a un bon moyen de trouver toutes les commandes dans un objet qui est du même type? Voici mon scénario, j'ai un contrôle de tabulation et dans chaque contrôle de tabulation existe un contrôle d'utilisateur (TOUS qui correspondent au même type de base par exemple MyBaseClassControl). Je veux être en mesure de trouver ce contrôle utilisateur SANS avoir à utiliser la méthode control.FindName ("controlName"), plutôt je voudrais obtenir un contrôle sur le contrôle par type (par exemple, la classe de base). La classe VisualTreeHelper semble ne rien faire pour moi car elle ne renvoie que des objets Silverlight natifs.Trouver des commandes du même type

Répondre

0

Compte tenu de ceci:

public static IEnumerable<DependencyObject> AllChildren(this DependencyObject root) 
{ 
    var children = root.DirectChildren().ToList(); 
    return children.Union(children.SelectMany(o => o.AllChildren())); 
} 

public static IEnumerable<DependencyObject> DirectChildren(this DependencyObject parent) 
{ 
    var childCount = VisualTreeHelper.GetChildrenCount(parent); 
    for (var i = 0; i < childCount; i++) 
     yield return System.Windows.Media.VisualTreeHelper.GetChild(parent, i); 
} 

Vous pouvez le faire:

myObj.AllChildren().OfType<MyBaseClassControl>(); 
+0

cette méthode d'extension Bizarrement jamais retourner mon type de base sur mesure. Les méthodes "GetChildren" dans le VisualTreeHelper sont-elles récursives? J'ai oublié de mentionner que le contrôle que je cherche est contenu dans une grille. – user378212

+0

Devrait fonctionner bien que sérieusement inefficace. 'Union' doit suivre les objets ne sont pas inclus plus d'une fois dans la sortie qui dans ce cas est inutile, les enfants sont placés sont placés dans un' List '(également inutile) et tout cela est fait récursivement qui, sur un profondément imbriqué arbre d'objet augmente le coût de tout cela massivement. – AnthonyWJones

+0

D'accord, si la performance devient le problème, cela peut et devrait être optimisé. Aux fins de la question - par ex. comment trouver un contrôle par type - cela le démontre bien. –

Questions connexes