UWP VisualTreeHelper 错误参数参考

UWP VisualTreeHelper Wrong Parameter Reference

我想修改TabViewTabItem中的内容。 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时,才进行下一步。