• WPF TreeView大数据量多层级搜索定位


    private  bool ExpandAndSelectItem(ItemsControl parentContainer, object itemToSelect)
         {
             //检查当前级别的所有项目
             foreach (Object item in parentContainer.Items)
             {
                 TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                 //如果数据项与我们要选择的项匹配,则设置相应的项
                 //TreeViewItem 是被选为真的
                 if (item == itemToSelect && currentContainer != null)
                 {
                     currentContainer.IsSelected = true;
                     currentContainer.BringIntoView();
                     currentContainer.Focus();
                     //item被找到
                     return true;
                 }
             }
             //如果我们到达这一点,在当前级别上找不到所选项目,所以我们必须检查 children
             foreach (Object item in parentContainer.Items)
             {
                 TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                 //如果 children 存在
                 if (currentContainer != null && currentContainer.Items.Count > 0)
                 {
                     //跟踪树视图项是否被扩展
                     bool wasExpanded = currentContainer.IsExpanded;
                     //展开当前的树视图项,以便我们可以检查它的子树视图项
                     currentContainer.IsExpanded = true;
                     //如果尚未生成树视图项子容器,则必须侦听
                     //状态更改事件,直到它们是
                     if (currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                     {
                         //将事件处理程序存储在变量中,以便我们可以删除它(在处理程序本身中)
                         EventHandler eh = null;
                         eh = new EventHandler(delegate
                         {
                             if (currentContainer.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                             {
                                 if (ExpandAndSelectItem(currentContainer, itemToSelect) == false)
                                 {
                                     //假设在此事件处理程序中执行的代码是父进程的结果
                                     //由于没有生成容器而被扩展。
                                     //由于在孩子们中找不到“选择”项,所以折叠父项,因为它以前是折叠的
                                     currentContainer.IsExpanded = false;
                                 }
                                 //删除状态更改事件处理程序,因为我们刚刚处理了它(我们只需要它一次)
                                 currentContainer.ItemContainerGenerator.StatusChanged -= eh;
                             }
                         });
                         currentContainer.ItemContainerGenerator.StatusChanged += eh;
                     }
                     else //否则容器已经生成,所以在子目录中查找要选择的项
                     {
                         if (ExpandAndSelectItem(currentContainer, itemToSelect) == false)
                         {
                             //恢复当前树视图项的扩展状态
                             currentContainer.IsExpanded = wasExpanded;
                         }
                         else //否则找到并选择节点,因此返回true
                         {
                             return true;
                         }
                     }
                 }
             }
             //找不到item
             return false;
         }
  • 相关阅读:
    一行代码跨平台适配颠覆传统手机建站模式
    struts2接收参数的几种形式<转>
    MyEclipse生成多对多映射文件和POJO <转>
    Hibernate延迟加载机制
    Hibernate常见面试知识点<转>
    Hibernate一级缓存详解
    App Icon and Launch Images for iOS7.0 or Later
    iOS7 UITextView 光标问题
    iOS中让颜色赋值简单一点吧
    iOS状态栏变文字颜色改变
  • 原文地址:https://www.cnblogs.com/DoNetCShap/p/16400286.html
Copyright © 2020-2023  润新知