这是一个简单的方法:
public static T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
T grandChild = null;
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
{
return (T)child;
}
else
{
grandChild = GetChildObject<T>(child, name);
}
if (grandChild != null)
{
return grandChild;
}
}
return null;
}
从您的描述中,您已经可以获取目标元素的容器。假设您需要的元素已命名TargetEle
,类型为TextBlock
. 你可以这样写:
var target = GetChildObject<TextBlock>(container,"TargetEle");
更新
我测试了你的代码,发现你没有捕捉到页面加载的事件。
实际上,该SelectionChanged
事件是在 TabView 刚刚创建的时候触发的,但是可视化树还没有加载,您无法通过代码从中获取内容。您可以在页面中创建一个IsLoaded
属性,在页面加载时将其设置为True,并在该SelectionChanged
时间确定该属性。
只有当它为 True 时,才进行下一步。