Priya Karthish Ответов: 1

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;
        }

1 Ответов

Рейтинг:
8

Gerry Schmitz

Слишком занятый.

Создайте "теневую" коллекцию выбранных элементов и проиндексируйте ее. Используйте выбранный элемент из тени для синхронизации "основного" вида.


Priya Karthish

Спасибо, Джерри. Твоя идея сработала. Я нашел решение.