zoukankan      html  css  js  c++  java
  • wpf如何获取control template里的元素

    wpf中的控件模板里的元素有自己独立的命名域。 因此不能通过FindName来根据x:Name来查找子节点。

    自己写了一个方法, 通过可视树遍历子节点,然后匹配名字。 如下:

       private static ChildItem FindVisualChildItem<ChildItem>(DependencyObject obj) where ChildItem : DependencyObject
            {
                if (null != obj)
                {
                    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                    {
                        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                        if (child != null && child is ChildItem)
                            return (ChildItem)child;
                        else
                        {
                            ChildItem childOfChild = FindVisualChildItem<ChildItem>(child);
                            if (childOfChild != null)
                                return childOfChild;
                        }
                    }
                }
                return null;
            }
     
            private static ChildItem FindVisualChildItem<ChildItem>(DependencyObject obj, string name) where ChildItem : FrameworkElement
            {
                if (null != obj)
                {
                    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                    {
                        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                        if (child != null && child is ChildItem && (child as ChildItem).Name.Equals(name))
                        {
                            return (ChildItem)child;
                        }
                        else
                        {
                            ChildItem childOfChild = FindVisualChildItem<ChildItem>(child, name);
                            if (childOfChild != null && childOfChild is ChildItem && (childOfChild as ChildItem).Name.Equals(name))
                            {
                                return childOfChild;
                            }
                        }
                    }
                }
                return null;
            }
    


    今天无意中发现系统FrameworkElement自带了一个方法
    

    GetTemplateChild 

    此方法同样实现了根据名字来获取控件模板里的子节点。 反编译PresentaitionFramework,源码如下:

    protected internal DependencyObject GetTemplateChild(string childName)
    {
        FrameworkTemplate templateInternal = this.TemplateInternal;
        if (templateInternal == null)
        {
            return null;
        }
        return StyleHelper.FindNameInTemplateContent(this, childName, templateInternal) as DependencyObject;
    }


    internal static object FindNameInTemplateContent(DependencyObject container, string childName, FrameworkTemplate frameworkTemplate)
    {
        int num = StyleHelper.QueryChildIndexFromChildName(childName, frameworkTemplate.ChildIndexFromChildName);
        if (num == -1)
        {
            Hashtable @value = StyleHelper.TemplatedNonFeChildrenField.GetValue(container);
            if (@value != null)
            {
                return @value[childName];
            }
        }
        return null;
        return StyleHelper.GetChild(container, num);
    }


    主要是childIndexFromChildName根据name来查询index,然后根据index获取对应子节点。 














  • 相关阅读:
    javascript 中检测数据类型的方法
    javascript 中的类数组和数组
    html5 构造网页的新方式
    关于 jQuery 中的 $.data() 方法和 jQuery 对象上的data 方法
    基于北洋PT站表结构分析以及ORM重写
    面试题准备
    sqlalchemy 外键
    sqlalchemy
    ansible roles
    ansible
  • 原文地址:https://www.cnblogs.com/muzizongheng/p/3170850.html
Copyright © 2011-2022 走看看