2009-12-11 4 views
15

J'ai un contrôle dans WPF qui a un Uid unique. Comment puis-je récupérer l'objet par son Uid?Obtenir l'objet par son UID dans WPF

+1

Veuillez préciser. Quel est votre UID? Comment est-il défini? –

+0

C'est une propriété de dépendance de n'importe quel contrôle dans wpf ou silverlight .. j'ai réussi à résoudre ceci, mais je me demandais s'il existe une méthode intégrée. – jose

Répondre

11

Vous avez à peu près à le faire par force brute. Voici une méthode d'extension d'aide, vous pouvez utiliser:

private static UIElement FindUid(this DependencyObject parent, string uid) 
{ 
    var count = VisualTreeHelper.GetChildrenCount(parent); 
    if (count == 0) return null; 

    for (int i = 0; i < count; i++) 
    { 
     var el = VisualTreeHelper.GetChild(parent, i) as UIElement; 
     if (el == null) continue; 

     if (el.Uid == uid) return el; 

     el = el.FindUid(uid); 
     if (el != null) return el; 
    } 
    return null; 
} 

Ensuite, vous pouvez l'appeler comme ceci:

var el = FindUid("someUid"); 
+0

Est-ce que 'GetChild (parent, N)' n'a pas la complexité de O (N)? L'approche foreach semble plus propre (et plus claire) pour moi. – AgentFire

2

Cela vaut mieux.

public static UIElement FindUid(this DependencyObject parent, string uid) { 
    int count = VisualTreeHelper.GetChildrenCount(parent); 

    for (int i = 0; i < count; i++) { 
     UIElement el = VisualTreeHelper.GetChild(parent, i) as UIElement; 
     if (el != null) { 
      if (el.Uid == uid) { return el; } 
      el = el.FindUid(uid); 
     } 
    } 
     return null; 
} 
+0

Il ne peut pas être mieux si votre code ne fonctionne pas. Votre récursivité est cassée. Le résultat de 'el.FindUid (uid)', sinon null, doit être retourné. –

2
public static UIElement GetByUid(DependencyObject rootElement, string uid) 
{ 
    foreach (UIElement element in LogicalTreeHelper.GetChildren(rootElement).OfType<UIElement>()) 
    { 
     if (element.Uid == uid) 
      return element; 
     UIElement resultChildren = GetByUid(element, uid); 
     if (resultChildren != null) 
      return resultChildren; 
    } 
    return null; 
} 
1

Une question que j'avais la réponse est supérieure qu'il ne sera pas regarder à l'intérieur des contrôles de contenu (tels que les contrôles utilisateur) pour les éléments dans leur contenu. Afin de rechercher à l'intérieur de ceux-ci j'ai étendu la fonction pour regarder la propriété de contenu des contrôles compatibles.

public static UIElement FindUid(this DependencyObject parent, string uid) 
{ 
    var count = VisualTreeHelper.GetChildrenCount(parent); 

    for (int i = 0; i < count; i++) 
    { 
     var el = VisualTreeHelper.GetChild(parent, i) as UIElement; 
     if (el == null) continue; 

     if (el.Uid == uid) return el; 

     el = el.FindUid(uid); 
     if (el != null) return el; 
    } 

    if (parent is ContentControl) 
    { 
     UIElement content = (parent as ContentControl).Content as UIElement; 
     if (content != null) 
     { 
      if (content.Uid == uid) return content; 

      var el = content.FindUid(uid); 
      if (el != null) return el; 
     } 
    } 
    return null; 
} 
Questions connexes