WPF TreeView大数据量多层级搜索定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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 ; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步