2009-12-11 1 views
15

Ich habe ein Steuerelement in WPF, die eine eindeutige Uid hat. Wie kann ich das Objekt anhand seiner UID abrufen?Get Objekt durch seine Uid in WPF

+1

Bitte erläutern. Was ist deine UID? Wie ist es festgelegt? –

+0

Es ist eine Abhängigkeitseigenschaft von jedem Steuerelement in WPF oder Silverlight .. Ich habe es geschafft, dies zu lösen, aber ich fragte mich, ob eine eingebaute Methode existiert. – jose

Antwort

11

Sie müssen es so ziemlich durch Brute-Force tun. Hier ist ein Helfer Erweiterung Methode, die Sie verwenden können:

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; 
} 

Dann sind Sie es so nennen kann:

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

Hat 'GetChild (parent, N)' nicht die Komplexität von O (N)? Der foreach-Ansatz erscheint mir sauberer (und klarer). – AgentFire

2

Das ist besser.

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

Es kann nicht besser sein, wenn Ihr Code nicht funktioniert. Deine Rekursion ist unterbrochen. Das Ergebnis von 'el.FindUid (uid)', falls nicht null, muss zurückgegeben werden. –

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

Ein Problem, das ich mit der Top-Antwort hatte, dass es nicht innerhalb von Inhaltssteuer (zB Bedienelemente) für Elemente in ihrem Inhalt suchen. Um in diesen zu suchen, habe ich die Funktion erweitert, um die Content-Eigenschaft von kompatiblen Steuerelementen zu betrachten.

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; 
}