UWP VisualTreeHelper 错误参数参考
UWP VisualTreeHelper Wrong Parameter Reference
我想修改TabView
的TabItem
中的内容。 TabItem
使用 DataTemplate
.
当我尝试访问该项目的子项时,如下所示:
var container = tabview.ContainerFromIndex(tabview.SelectedIndex);
int count = VisualTreeHelper.GetChildrenCount(container);
我在第二行得到了ArgumentException: Wrong Parameter Reference
。应该如何使用VisualTreeHelper来修改呢?
这是一个简单的方法:
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
属性,在Page Loaded的时候设置为True,在SelectionChanged
的时候确定这个属性。
只有当为True时,才进行下一步。
我想修改TabView
的TabItem
中的内容。 TabItem
使用 DataTemplate
.
当我尝试访问该项目的子项时,如下所示:
var container = tabview.ContainerFromIndex(tabview.SelectedIndex);
int count = VisualTreeHelper.GetChildrenCount(container);
我在第二行得到了ArgumentException: Wrong Parameter Reference
。应该如何使用VisualTreeHelper来修改呢?
这是一个简单的方法:
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
属性,在Page Loaded的时候设置为True,在SelectionChanged
的时候确定这个属性。
只有当为True时,才进行下一步。