2009-01-20 5 views
2

J'ai des boutons Premier/Dernier/Précédent/Suivant qui modifient le nœud enfant sélectionné d'un TreeViewItem. Définir le premier et le dernier nœud comme sélectionné n'est pas un problème. Par exemple, pour sélectionner le dernier nœud enfant:Comment puis-je sélectionner TreeViewItem suivant/précédent dans un TreeView?

TreeViewItem selectedItem = (myTreeView.SelectedItem as TreeViewItem); 
TreeViewItem ParentItem = (selectedItem.Parent as TreeViewItem); 
(ParentItem.Items[ParentItem.Items.Count - 1] as TreeViewItem).IsSelected = true; 

Quelle serait la meilleure façon/la plus élégante de régler le précédent/Article suivant comme étant sélectionné?

Merci!

Répondre

5

Vous pouvez remplacer la boucle for par un appel IndexOf.

int index = ParentItem.Items.IndexOf(MyTreeView.SelectedItem) 

Et bien sûr, il sera bon de vérifier si index + 1 est un index de collection valide.

Et pour le frère précédent, il sera index - 1.

+0

Travaillé comme un charme! Merci! – Pwninstein

0

Ce n'est pas élégant, mais ça marche. quelqu'un peut-il trouver une meilleure solution? (La fonctionnalité "Suivant" est affichée)

int index = 0; 
foreach (TreeViewItem i in ParentItem.Items) { 
    if (i.Equals(MyTreeView.SelectedItem)) { 
     break; 
    } 
    index++; 
} 
(ParentItem.Items[index + 1] as TreeViewItem).IsSelected = true; 
2

Ma variante travaille pour moi au moins pour arbre à 4 niveaux.

Si le curseur correspond au dernier arbre, il se place au début. Si vous appuyez sur Précédent au premier nœud, vous restez en place.

 // Button Back 
    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     if (treeViewStruct.Items.Count < 1) return; 
     if (Currentitem == null) 
     { 
      ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true; 
      return; 
     } 
     TreeViewItem item = FindPreviousItem(Currentitem); 
     if (item == null) 
      ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true; 
     else item.IsSelected = true; 
    } 

    /// <summary> 
    /// Get Previous Node 
    /// </summary> 
    /// <param name="item">Current selected node</param> 
    /// <returns></returns> 
    private static TreeViewItem FindPreviousItem(TreeViewItem item) 
    { 
     TreeViewItem foundedItem = null; 
     var parentItem = (item.Parent as TreeViewItem); 
     if (parentItem != null) 
     { 
      int index = parentItem.Items.IndexOf(item); 
      if (index > 0 && index < parentItem.Items.Count) 
      { 
       return FindLastChildren((TreeViewItem)parentItem.Items[index - 1]); 
      } 
      else if (index == 0) 
       return parentItem; 
     } 
     else return item; 
     return foundedItem; 
    } 



    private static TreeViewItem FindLastChildren(TreeViewItem parent) 
    { 
     if (parent.Items.Count > 0) 
     { 
      return FindLastChildren((TreeViewItem)parent.Items.Last()); 
     } 
     else return parent; 
    } 

    // вперед 
    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     if (treeViewStruct.Items.Count < 1) return; 
     if (Currentitem == null) 
     { 
      ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true; 
      return; 
     } 
     TreeViewItem item = FindNextItem(Currentitem); 
     if (item == null) 
      ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true; 
     else item.IsSelected = true; 
    } 


    /// <summary> 
    /// Get Next Node 
    /// </summary> 
    /// <param name="item">Current selected node</param> 
    /// <returns></returns> 
    private static TreeViewItem FindNextItem(TreeViewItem item) 
    { 
     TreeViewItem foundedItem = null; 
     if (item.Items.Count < 1) 
     { 
      var parentItem = (item.Parent as TreeViewItem); 
      if (parentItem != null) 
      { 
       int index = parentItem.Items.IndexOf(item); 
       if (index > 0 && index < parentItem.Items.Count - 1) 
       { 
        return (TreeViewItem)parentItem.Items[index + 1]; 
       } 
       else if (index == parentItem.Items.Count - 1) 
       { 
        return FindFirstNextParent(parentItem); 
       } 
      } 
      else return item; 
     } 
     return (TreeViewItem)item.Items[0]; 
    } 

    private static TreeViewItem FindFirstNextParent(TreeViewItem parent) 
    { 
     var parentParent = ((TreeViewItem)parent).Parent; 
     if (parentParent is TreeViewItem) 
     { 
      int pindex = ((TreeViewItem)parentParent).Items.IndexOf(parent); 
      if ((pindex + 1) < ((TreeViewItem)parentParent).Items.Count) 
       return ((TreeViewItem)((TreeViewItem)parentParent).Items[pindex + 1]); 
      else 
      { 
       return FindFirstNextParent(((TreeViewItem)((TreeViewItem)parent).Parent)); 
      } 
     } 
     return parent; 
    } 
Questions connexes