0

我想修改 aTabItem中的内容TabView。这TabItem使用DataTemplate.

当我尝试访问该项目的子项时,如下所示:

        var container = tabview.ContainerFromIndex(tabview.SelectedIndex);
        int count = VisualTreeHelper.GetChildrenCount(container);

ArgumentException: Wrong Parameter Reference在第二行得到了。我应该如何使用 VisualTreeHelper 来修改它?

4

1 回答 1

2

这是一个简单的方法:

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 时,才进行下一步。

于 2019-09-06T11:48:15.180 回答