所有这些答案都非常好,但是,如果你试图找到一个特定的 T 类型的视觉孩子,你要么被困住,然后找到你想要的,要么希望你得到的第一个是一个你想要的。我合并了几种方法以根据标准找到特定的方法。它有点像 LINQ,但我不想尝试处理递归枚举器。
像这样使用它:
MyContainer.FirstOrDefaultChild<Label>(l => l.Content=="State")
我把它写成一个扩展方法。
public static class DependencyObjectExtensions
{
public static T FirstOrDefaultChild<T>(this DependencyObject parent, Func<T, bool> selector)
where T : DependencyObject
{
T foundChild;
return FirstOrDefaultVisualChildWhere(parent, selector, out foundChild) ? foundChild : default(T);
}
private static bool FirstOrDefaultVisualChildWhere<T>(DependencyObject parent, Func<T, bool> selector,
out T foundChild) where T : DependencyObject
{
var count = VisualTreeHelper.GetChildrenCount(parent);
for (var i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
var tChild = child as T;
if (tChild != null)
{
if (!selector(tChild)) continue;
foundChild = tChild;
return true;
}
if (FirstOrDefaultVisualChildWhere(child, selector, out foundChild))
{
return true;
}
}
foundChild = default(T);
return false;
}