zoukankan      html  css  js  c++  java
  • 根据控件类型,动态查找ItemTemplate的控件

      本文写的如何动态查找ItemTemplate里的控件。像ListView,GridView,FlipView等控件可以通过自定义ItemTemplate来更好呈现每一个item的内容。也许你觉得可以通过绑定来实现自动改变值,不需要动态查找ItemTemplate里的控件。我可以说确实如此。但是本文提供的是另一种思路,动态查找ItemTemplate里的控件,从而达到对相应控件进行操作的目的。

      首先我们要知道为什么不能直接给ItemTemplate的控件添加“Name”或“x:Name”属性,这样就可以通过名字直接找到对应控件。那是因为像ListView之类的控件一般都会有很多Item,而每个Item的ItemTemplate都是一样的。我们无法为每个Item对应的Template里的控件命名。但是有的时候又非得找到某个Item对应Template里的某个控件,并对其进行操作。不废话,直接贴代码:

    private childItem FindVisualChild<childItemType>(DependencyObject obj)
            where childItemType : DependencyObject
    {
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
      {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItemType)
          return (childItemType)child;
        else
          {

          childItem childOfChild = FindVisualChild<childItemType>(child);
          if (childOfChild != null)
          return childOfChild;
        }
      }
      return null;
    }

      相信大家一看就知道了,这段主要通过VisualTreeHelper这个来递归查找子元素。其中childItemType就是查找的ItemTemplate

    里的某个控件的类型,而传入参数obj就是这个ItemTemplate对应的某个Item。下面再来看看如何使用这个函数:

    var item = salesStage.ItemContainerGenerator.ContainerFromIndex(i);  

    //这里的salesStage是一个GridView,通过salesStage.ItemContainerGenerator和它的某个Item的Index,就可以找到这个Item所对应的Container(其实也就是Template)。

    var stackPanel = FindVisualChild<StackPanel>(item);

    //然后我们将这个找到的item作为参数调用前面的函数,我这里找的是StackPanel,这样的就能够找到Template下StackPanel了哦,当然如果有多个相同控件的,就需要通过循环自己去控制找哪个了哦。

  • 相关阅读:
    暴破助攻提权:ruadmin
    Python 绝技 —— TCP服务器与客户端
    代码审计| HDWiki 漏洞(一)
    Android逆向——smali复杂类解析
    从外部入侵公司:外部渗透测试
    大脸猫讲逆向之ARM汇编中PC寄存器详解
    Ms17-010进行WEB提权之实践下某培训靶机服务器
    XSS钓鱼某网约车后台一探究竟,乘客隐私暴露引发思考
    python爬虫实践教学
    Swif语法基础 要点归纳(一)
  • 原文地址:https://www.cnblogs.com/wuhaowinner/p/ItemTemplate.html
Copyright © 2011-2022 走看看