103 votes

Clic droit sélectionnez nœud de TreeView sur avant d’afficher le ContextMenu

J’ai aime de forger sélectionner un nœud de TreeView WPF en clic droit, juste avant le ContextMenu affiché.

Pour les formulaires Windows, je pouvais utiliser code comme ce http://stackoverflow.com/questions/2527/c-treeview-context-menus, quelles sont les alternatives WPF ?

133voto

alex2k8 Points 12225

Selon la façon dont l’arborescence a été remplie, l’expéditeur et le e.Source les valeurs peuvent varier.

Une des solutions possibles consiste à utiliser e.OriginalSource et trouver le TreeViewItem utilisant le VisualTreeHelper :

25voto

Martin Liversage Points 43712

Si vous voulez une XAML seule solution, vous pouvez utiliser le Mélange de l'Interactivité.

Assumer l' TreeView data est lié à un ensemble hiérarchique de vue-les modèles ayant un Boolean bien IsSelected et String bien Name ainsi que d'une collection d'éléments enfant nommé Children.

<TreeView ItemsSource="{Binding Items}">
  <TreeView.ItemContainerStyle>
    <Style TargetType="TreeViewItem">
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
    </Style>
  </TreeView.ItemContainerStyle>
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
      <TextBlock Text="{Binding Name}">
        <i:Interaction.Triggers>
          <i:EventTrigger EventName="PreviewMouseRightButtonDown">
            <ei:ChangePropertyAction PropertyName="IsSelected" Value="true" TargetObject="{Binding}"/>
          </i:EventTrigger>
        </i:Interaction.Triggers>
      </TextBlock>
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

Il y a deux choses intéressantes:

  1. L' TreeViewItem.IsSelected de propriété est lié à l' IsSelected de la propriété sur la vue-modèle. Réglage de l' IsSelected de la propriété sur la vue-modèle true, sélectionnez le nœud correspondant dans l'arbre.

  2. Lors de l' PreviewMouseRightButtonDown feux sur la partie visuelle du nœud (dans cet exemple un TextBlock) IsSelected de la propriété sur la vue-modèle est défini sur true. Retour à 1. vous pouvez voir que le nœud correspondant qui a été cliqué dans l'arbre devient le nœud sélectionné.

Une manière d'obtenir le Mélange de l'Interactivité dans votre projet est d'utiliser le package NuGet Officieux.Mélange.L'interactivité.

17voto

Erlend Points 119

À l’aide de « item. Focus() ; » ne semble pas fonctionner 100 %, à l’aide de « point. IsSelected = true ; » fait.

12voto

Stefan Points 29091

En XAML, ajoutez un gestionnaire de PreviewMouseRightButtonDown en XAML :

Puis gérez l’événement comme ceci :

12voto

Sean Hall Points 2011

À l’aide de l’idée originale d’alex2k8, manipulation correctement non-visuels de Wieser Software Ltd, le code XAML de Stefan, le IsSelected de Erlend et ma contribution de faire véritablement de la méthode statique générique :

XAML :

C# code-behind :

Edit : Le code précédent a toujours bien fonctionné pour ce scénario, mais dans un autre scénario que VisualTreeHelper.GetParent retourne null lorsque LogicalTreeHelper a retourné une valeur, alors que fixe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X