Treeviewitem траверс с ключом массива вверх и вниз через searcheditem
Я делаю поиск в своем Treeview и выделяю searchedText(который работает идеально). Мой следующий шаг-с помощью клавиш со стрелками вверх и вниз, мне нужно двигаться только к выделенному элементу поиска один за другим, а не к родителям, даже если он виден. С помощью клавиши вниз он правильно перемещается к выделенному элементу один за другим. (Работает Идеально)
Но с ключом вверх он вообще не движется.Цикл рекурсивен и всегда возвращает null. Я пробовал разные способы, но мне было трудно понять это. пожалуйста помочь. Я застрял с этим примерно на неделю.
Что я уже пробовал:
<pre> private void DrinksTreeView_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Tab || e.Key == Key.Down) { TreeViewItem selectedItem = (SearchTreeView.SelectedItem) as TreeViewItem; if (selectedItem != null) { TreeViewItem nextItem = FindNextFocusableItem(selectedItem, true); if (nextItem != null) { nextItem.IsSelected = true; } } e.Handled = true; } else if (e.Key == Key.Up) { TreeViewItem selectedItem = (SearchTreeView.SelectedItem) as TreeViewItem; if (selectedItem != null) { Keyboard.Focus(SearchTreeView.SelectedItem as IInputElement); FindPreviousItem(selectedItem); } e.Handled = true; } }
Эта функция выполняет событие клавиши со стрелкой вниз
<pre> private TreeViewItem FindNextFocusableItem(TreeViewItem currentItem, bool gosubTreeView) { if (gosubTreeView && currentItem.IsExpanded) { TreeViewItem item = currentItem.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; if (item != null) { string itemHeader = item.Header.ToString().Trim(); findAll = itemHeader.IndexOf(txtSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0; if (item.Visibility == Visibility.Visible) { if (findAll == true) { return item; } else { return FindNextFocusableItem(item, true); } } return FindNextFocusableItem(item, false); } } ItemsControl parentItemsControl = ItemsControl.ItemsControlFromItemContainer(currentItem); if (parentItemsControl != null) { TreeViewItem item2; int index = parentItemsControl.ItemContainerGenerator.IndexFromContainer(currentItem); int count = parentItemsControl.Items.Count; while (index < count) { index++; item2 = parentItemsControl.ItemContainerGenerator.ContainerFromIndex(index) as TreeViewItem; if ((item2 != null)) { string itemHeader = item2.Header.ToString().Trim(); findMe = itemHeader.IndexOf(txtSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0; if (item2.Visibility == Visibility.Visible ) { if (findMe == true) { return item2; } else { return FindNextFocusableItem(item2, true); } } } } item2 = parentItemsControl as TreeViewItem; if ((item2 != null)) { return FindNextFocusableItem(item2, false); } return null; } return null; }
Эта функция выполняет событие клавиши со стрелкой вверх
<pre> private TreeViewItem FindPreviousItem(TreeViewItem thisItem) { if (!(((TreeViewItem)thisItem).Parent is TreeView)) { ItemCollection nodes = ((TreeViewItem)((TreeViewItem)thisItem).Parent).Items; for (int i = 0; i < nodes.Count; i++) { TreeViewItem whatItem = (TreeViewItem)nodes[i]; if (nodes[i].Equals(thisItem)) { try { if (i > 0) { TreeViewItem whatnextItem = (TreeViewItem)nodes[i-1]; if (whatnextItem.IsVisible == true) { string itemHeader = whatnextItem.Header.ToString().Trim(); findMe = itemHeader.IndexOf(txtSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0; if (findMe == true) { whatnextItem.IsSelected = true; } else { FindPreviousItem(whatnextItem); } } } else { TreeViewItem whichItem = (TreeViewItem)((TreeViewItem)nodes[i]).Parent; if (whichItem.IsVisible == true) { string itemHeader = whichItem.Header.ToString().Trim(); findAll = itemHeader.IndexOf(txtSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0; if (findAll == true) { whichItem.IsSelected = true; } else { FindPreviousItem(whichItem); } } else { FindPreviousItem(whichItem); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } return null; } return null; }