【问题标题】:UWP VisualTreeHelper Wrong Parameter ReferenceUWP VisualTreeHelper 参数错误参考
【发布时间】:2019-09-06 10:01:42
【问题描述】:

我想修改TabItemTabView 中的内容。而TabItem 使用DataTemplate

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

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

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

【问题讨论】:

    标签: c# uwp win-universal-app visualtreehelper


    【解决方案1】:

    这是一个简单的方法:

    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 时间确定该属性。

    只有当它为真时,才进行下一步。

    【讨论】:

    • 我不能这样做VisualTreeHelper.GetChildrenCount(obj)。它给了我问题中描述的一个例外。
    • 您能描述一下您是如何创建TabView(包括XAML 代码)的吗?检查你得到的容器。是预期值吗?
    • 这是预期的。我认为它的创建方式并不重要,因为我正在向我的应用程序添加新功能。如果你真的想看,那就是here
    • 啊,ContainerFromIndex 为空。虽然SelectedIndex 是预期的。
    • 我测试了你的代码,发现你没有捕捉到页面加载的事件。实际上,SelectionChanged 事件是在 TabView 刚刚创建的时候触发的,但是视觉树还没有加载,你无法通过代码从中获取内容。您可以在页面中创建IsLoaded 属性,在页面加载时将其设置为True,并在SelectionChanged 时间确定该属性。只有当它为 True 时,才进行下一步。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2013-02-11
    • 2015-07-30
    • 2018-03-12
    • 2012-12-27
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多