2009-12-11 15 views
15

Ho un controllo in WPF che ha un Uid univoco. Come posso recuperare l'oggetto dal suo Uid?Ottieni oggetto dal relativo Uid in WPF

+1

Prego elaborare. Qual è il tuo UID? Come è impostato? –

+0

È una proprietà di dipendenza di qualsiasi controllo in wpf o silverlight .. sono riuscito a risolverlo, ma mi chiedevo se esistesse un metodo integrato. – jose

risposta

11

Devi praticamente farlo con la forza bruta. Ecco un metodo di estensione di supporto è possibile utilizzare:

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

Poi si può chiamare in questo modo:

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

Non 'GetChild (genitore, N)' ha la complessità di O (N)? L'approccio foreach sembra più pulito (e più chiaro) per me. – AgentFire

2

questo è meglio.

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

Non può essere migliore se il tuo codice non funziona. La tua ricorsione è rotta. Il risultato di 'el.FindUid (uid)', se non nullo, deve essere restituito. –

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

Un problema che ho avuto con la risposta in alto è che non guarderà dentro controlli di contenuto (ad esempio i controlli di utente) per gli elementi all'interno del loro contenuto. Per cercare all'interno di questi ho esteso la funzione per esaminare la proprietà Content dei controlli compatibili.

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