2009-12-11 11 views
15

Tengo un control en WPF que tiene un Uid único. ¿Cómo puedo recuperar el objeto por su Uid?Obtener el objeto por su Uid en WPF

+1

favor detalles. ¿Cuál es tu UID? ¿Cómo está establecido? –

+0

Es una propiedad de dependencia de cualquier control en wpf o silverlight. He logrado resolver esto, pero me preguntaba si existe un método incorporado. – jose

Respuesta

11

Tienes que hacerlo por fuerza bruta. Esto es un método de extensión de ayuda que puede utilizar:

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

Entonces se le puede llamar así:

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

¿'GetChild (parent, N)' no tiene la complejidad de O (N)? El enfoque foreach parece más limpio (y más claro) para mí. – AgentFire

2

Esto es mejor.

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

No puede ser mejor si su código no funciona. Tu recursión está rota. El resultado de 'el.FindUid (uid)', si no es nulo, debe ser devuelto. –

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 que tuve con la respuesta más común es que no va a mirar dentro de los controles de contenido (como controles de usuario) para los elementos dentro de su contenido. Para buscar dentro de estos amplié la función para mirar la propiedad de contenido de los controles 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; 
} 
Cuestiones relacionadas