Comment faire pour désélectionner tous les éléments sélectionnés dans un WPF arborescence en cliquant sur certaines zone vide?
J'ai une assez drôle de problème avec WPF. J'ai une arborescence, et de sélectionner les éléments fonctionne très bien jusqu'à présent. Le problème c'est que je veux pour désélectionner l'élément actuellement sélectionné lorsque l'utilisateur clique à l'intérieur de la zone vide de l'arborescence. Par défaut, le treeview maintient le courant de l'élément sélectionné, et j'ai ajouté une option du menu contextuel pour le désélectionner, ce qui est plutôt hardcore:
//Note: This is done recursivly from the start, so it
//works for child items as well
treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem) as TreeViewItem).IsSelected = false;
De plus, c'est contre-intuitif, car il oblige l'utilisateur à droite-cliquez sur la première, et la deuxième, après le désélectionner cette façon, l'utilisateur ne peut pas sélectionner plus en cliquant sur l'élément. Comment cela est-il censé fonctionner?
Edit: plus d'information: j'ai ajouté un gestionnaire à l' TreeView
à manipuler la souris cliquez sur les événements, mais l'expéditeur est toujours un TreeView
exemple, même si je clique directement sur un TreeViewItem
. Si j'ajoute un gestionnaire à mon TreeView.ItemTemplate
à la place (c'est à dire le premier enfant dans le modèle), je n'ai jamais eu d'événements lorsque je clique sur la zone vide (ce qui est plutôt logique). Le code ressemble à ceci:
private void MyTreeView_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if ((sender as TreeViewItem) == null)
{
//Always triggered
System.Diagnostics.Trace.Write("Empty area clicked");
}
}
Et le XAML est la suivante:
<TreeView x:Name="MyTreeView" Margin="3" MouseUp="MyTreeView_MouseUp">
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé que c'était beaucoup mieux pour moi. J'ai vérifier le originalsource qui, pour moi, si il s'agit de former un treeviewitem sera d'une image ou d'un textblock. J'ai aussi utiliser un objet de vue avec un HierarchicalDataTemplate et la BasicTreeViewBase est la classe de base pour tous mes objets différents. Voici le code.
TemplateTreeView.Focus();
?La non sélectionnable problème peut être résolu avec un appel à se Concentrer sur le TreeView après la mise TreeViewItem.IsSelected.
Il peut y avoir plus de deux problème :
pour toutes ces raison je utiliser cette fonction, mais la sélection ne doit pas le feu des événements.
J'ai mis en place un général de contrôle de sélection d'une fois, et à ce comportement.
C'est ainsi que ma méthode regardé (adapté pour le treeview):
Fondamentalement, marcher jusqu'à l'arbre à partir de la source. Si un TreeViewItem n'a pas été trouvé, que l'utilisateur a cliqué sur l'espace vide.
Utiliser l'extension de la classe ci-dessous
Puis dans l'événement MouseDown de treeview utiliser l'extension de la méthode ci-dessous:
Espère que cela fonctionne pour vous. Je l'ai travailler dans ce sens...
J'ai été en cours d'exécution dans cette situation moi-même avec une Arborescence personnalisée Affichage de la Liste de mise en œuvre après avoir cherché longtemps, j'ai enfin trouvé une solution qui a fonctionné pour moi.
L'explication complète peut être trouvé à http://social.msdn.microsoft.com/Forums/vstudio/en-US/36aca7f7-0b47-488b-8e16-840b86addfa3/getting-treeviewitem-for-the-selected-item-in-a-treeview
L'idée de base est de capturer l'
TreeViewItem.Selected
événement et enregistrer la source de l'événement dans leTag
attribut sur votre Arborescence. Puis, quand vous avez besoin pour la désactiver, vous pouvez accéder à laTag
attribut sur votre contrôle et de définir lesIsSelected
de la valeur à False. Cela fonctionne pour moi avec 2 niveaux d'imbrication des enfants. J'espère qu'il va travailler pour vous.Pour la persistance souci:
TreeView déclaration
Gestionnaire D'Événement
Clair logique de sélection de
Cela désélectionne actuellement sélectionné TreeViewItem si aucun n'a été cliqué:
Espère que c'est ce que vous cherchez!
Pour un C# treeview vous utilisez treeview.SelectedNode = null; je ne suis pas sûr si cela fonctionne pour WPF.
SelectedItem
est en lecture seule.