Je voudrais sélectionner un nœud WPF TreeView sur un clic droit, juste avant le ContextMenu affiché.
Pour WinForms, je pourrais utiliser un code tel que ce nœud de recherche cliqué dans le menu contextuel , quelles sont les alternatives WPF?
wpf
treeview
contextmenu
alex2k8
la source
la source
if (treeViewItem == null) treeView.SelectedIndex = -1
outreeView.SelectedItem = null
. Je pense que l'un ou l'autre devrait fonctionner.Si vous souhaitez une solution XAML uniquement, vous pouvez utiliser Blend Interactivity.
Supposons que les
TreeView
données soient liées à une collection hiérarchique de modèles de vue ayant uneBoolean
propriétéIsSelected
et uneString
propriétéName
ainsi qu'une collection d'éléments enfants nommésChildren
.Il y a deux parties intéressantes:
La
TreeViewItem.IsSelected
propriété est liée à laIsSelected
propriété sur le modèle de vue. La définition de laIsSelected
propriété sur le modèle de vue sur true sélectionnera le nœud correspondant dans l'arborescence.Lorsque se
PreviewMouseRightButtonDown
déclenche sur la partie visuelle du nœud (dans cet exemple aTextBlock
), laIsSelected
propriété du modèle de vue est définie sur true. En revenant à 1. vous pouvez voir que le nœud correspondant sur lequel on a cliqué dans l'arborescence devient le nœud sélectionné.Une façon d'obtenir l'interactivité de fusion dans votre projet consiste à utiliser le package NuGet Unofficial.Blend.Interactivity .
la source
i
etei
résolvent et dans quels assemblys ils peuvent être trouvés. Je suppose:xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
etxmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
, qui se trouvent respectivement dans les assemblys System.Windows.Interactivity et Microsoft.Expression.Interactions.ChangePropertyAction
tente de définir uneIsSelected
propriété de l'objet de données lié, qui ne fait pas partie de l'interface utilisateur, donc il n'a pas deIsSelected
propriété. Est-ce que je fais quelque chose de mal?IsSelected
propriété comme indiqué dans le deuxième paragraphe de ma réponse: Supposons que lesTreeView
données soient liées à une collection hiérarchique de modèles de vue ayant une propriété booléenneIsSelected
... (je souligne).Utilisation de "item.Focus ();" ne semble pas fonctionner à 100%, en utilisant "item.IsSelected = true;" Est-ce que.
la source
En XAML, ajoutez un gestionnaire PreviewMouseRightButtonDown en XAML:
Puis gérez l'événement comme ceci:
la source
En utilisant l'idée originale de alex2k8, en gérant correctement les non-visuels de Wieser Software Ltd, le XAML de Stefan, le IsSelected d'Erlend et ma contribution à vraiment rendre la méthode statique générique:
XAML:
Code C # derrière:
Edit: Le code précédent fonctionnait toujours très bien pour ce scénario, mais dans un autre scénario, VisualTreeHelper.GetParent retournait null lorsque LogicalTreeHelper renvoyait une valeur, donc corrigé cela.
la source
Presque à droite , mais vous devez faire attention aux éléments non visuels dans l'arborescence (comme un
Run
, par exemple).la source
Je pense que l'enregistrement d'un gestionnaire de classe devrait faire l'affaire. Enregistrez simplement un gestionnaire d'événements routés sur le PreviewMouseRightButtonDownEvent de TreeViewItem dans votre fichier de code app.xaml.cs comme ceci:
la source
Une autre façon de le résoudre à l'aide de MVVM est la commande de liaison pour un clic droit sur votre modèle de vue. Là, vous pouvez spécifier une autre logique ainsi que
source.IsSelected = true
. Cela utilise uniquement àxmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
partir deSystem.Windows.Interactivity
.XAML pour la vue:
Voir le modèle:
la source
J'avais un problème avec la sélection d'enfants avec une méthode HierarchicalDataTemplate. Si je sélectionnais l'enfant d'un nœud, cela sélectionnerait en quelque sorte le parent racine de cet enfant. J'ai découvert que l'événement MouseRightButtonDown serait appelé pour chaque niveau de l'enfant. Par exemple, si vous avez un arbre quelque chose comme ceci:
Rubrique 1
- Enfant 1
- Enfant 2
- Sous
-élément1 - Sous -élément2
Si je sélectionnais Subitem2, l'événement se déclencherait trois fois et l'élément 1 serait sélectionné. J'ai résolu cela avec un appel booléen et asynchrone.
Cela semble un peu brouillon, mais en gros, je règle le booléen sur true lors du premier passage et le réinitialise sur un autre thread en quelques secondes (3 dans ce cas). Cela signifie que le prochain passage par où il essaierait de monter dans l'arborescence sera ignoré, vous laissant avec le bon nœud sélectionné. Cela semble fonctionner jusqu'à présent :-)
la source
MouseButtonEventArgs.Handled
surtrue
. Puisque l'enfant est le premier à être appelé. Si cette propriété est définie sur true, les autres appels au parent seront désactivés.Vous pouvez le sélectionner avec l'événement on mouse down. Cela déclenchera la sélection avant que le menu contextuel ne démarre.
la source
Si vous souhaitez rester dans le modèle MVVM, vous pouvez effectuer les opérations suivantes:
Vue:
Code derrière:
VoirModèle:
Vous pouvez maintenant réagir à la modification de propriété ClickedTreeElement ou utiliser une commande qui fonctionne en interne avec ClickedTreeElement.
Vue étendue:
la source