2009-06-18 8 views
2

Récapitulatif Question:
Dans WPF TreeView, comment puis-je forcer l'événement sélectionné sur un élément qui est actuellement l'élément sélectionné?WPF TreeView - Forcer SelectedEvent sur l'élément déjà sélectionné

Informations détaillées:
J'essaie d'ajouter des fonctionnalités à mon TreeView WPF en ajoutant multiselect en utilisant shift (pour une plage) et de contrôle (pour basculer la sélection d'un élément). J'ai implémenté ma propre collection SelectedItems puisque TreeView n'a qu'un élément sélectionné. J'utilise toujours l'objet SelectedItem de TreeView pour qu'il ne casse pas la fonctionnalité du clavier, mais j'écrase le ItemContainerStyle existant de sorte que même si un élément est sélectionné, il ne donne pas l'apparence qu'il est sélectionné. Je n'aurais pas eu besoin de faire cela, je devais seulement mettre en évidence l'arrière-plan du bloc de texte de mes éléments treeview sélectionnés, plutôt que toute la largeur de l'élément, donc je gère les changements de couleur de premier plan et d'arrière-plan.

Répondre

1

L'implémentation d'une arborescence WPF utilise beaucoup de XAML. Cette réponse ne contient donc que des fragments de code.

Mon objectif était de cliquer sur un élément de vue arborescente sélectionné dans un volet de gauche et d'actualiser des éléments dans un volet de droite (comme l'Explorateur Windows).

Pour sélectionner un travail d'élément sélectionné TreeView, je mis en œuvre deux événements dans l'exemple suivant XAML dans mon ViewModel:

  • OnItemSelected utilisant événement TreeViewItem.Selected
  • MouseLeftButtonUp événement à l'aide TreeViewItem.MouseLeftButtonUp

Lorsque mon événement MouseLeftButtonUp se déclenche, je m'assure d'indiquer que j'ai géré l'événement en utilisant:

  • args.Handled = true;

Voici le XAML

<TreeView Name="MyTreeView" 
    ItemsSource="{Binding Collections}" 
    Margin="0"       
    Grid.Row="0" 
    TreeViewItem.Selected="OnItemSelected" 
    TreeViewItem.Unselected="OnItemUnSelected"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <EventSetter Event="TreeViewItem.MouseLeftButtonUp" Handler="MouseLeftButtonUp"/> 
      <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 

    <!-- other XAML removed for this answer--> 

</TreeView> 

Voici les gestionnaires d'événements

private void OnItemSelected(object sender, RoutedEventArgs e) 
{ 
    // do something... 
} 


// additional info: cannot detect mouse down events; preview mouse events also work 
private void MouseLeftButtonUp(object sender, MouseButtonEventArgs args) 
{ 
    TreeViewItem tvi = sender as TreeViewItem; 
    if (tvi != null) 
    { 
     // process folder items 
     MyViewModel fvm = tvi.Header as MyViewModel; 
     if (fvm != null) 
     { 
     // only process selected treeview items 
     if (fvm.IsSelected) 
     { 
      fvm.IsSelected = true; 

      // prevent bubbling once we find the selected tree view item 
      args.Handled = true; 
     } 
     } 
} 
Questions connexes