wpf object wpf-controls fetch

Consigue objeto por su Uid en WPF.



object wpf-controls (4)

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


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


Tienes que hacerlo por fuerza bruta. Aquí hay un método de extensión auxiliar 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 puedes llamarlo así:

var el = FindUid("someUid");


Un problema que tuve con la respuesta principal es que no buscará elementos dentro de los controles de contenido (como los controles de usuario) en su contenido. Para buscar dentro de estos, extendí la función para ver la propiedad 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; }


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