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
Antwort
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");
Hat 'GetChild (parent, N)' nicht die Komplexität von O (N)? Der foreach-Ansatz erscheint mir sauberer (und klarer). – AgentFire
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;
}
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. –
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;
}
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;
}
Bitte erläutern. Was ist deine UID? Wie ist es festgelegt? –
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