Comment puis-je annuler un utilisateur WPF Arborescence, cliquez sur?
J'ai une application WPF avec un contrôle Treeview.
Lorsque l'utilisateur clique sur un nœud de l'arbre, d'autres TextBox, ComboBox, etc. les contrôles sur la page sont remplis avec les valeurs appropriées.
L'utilisateur peut ensuite apporter des modifications à ces valeurs et de les enregistrer ses modifications en cliquant sur un bouton "Enregistrer".
Toutefois, si l'utilisateur sélectionne un autre nœud de Treeview sans enregistrer ses modifications, je veux afficher un avertissement et une opportunité pour annuler la sélection.
XAML...
<TreeView Name="TreeViewThings"
...
TreeViewItem.Unselected="TreeViewThings_Unselected"
TreeViewItem.Selected="TreeViewThings_Selected" >
Visual Basic...
Sous TreeViewThings_Unselected(ByVal sender as System.Objet, _ ByVal e as System.De Windows.RoutedEventArgs) Dim OldThing Comme Chose = DirectCast(e.OriginalSource.DataContext, Chose) Si CancelDueToUnsavedChanges(OldThing) Puis "mettre l'annulation de code ici Fin De Si End Sub Sous TreeViewThings_Selected(ByVal sender as System.Objet, _ ByVal e as System.De Windows.RoutedEventArgs) Dim NewThing Comme Chose = DirectCast(e.OriginalSource.DataContext, Chose) PopulateControlsFromThing(NewThing) End Sub
Comment puis-je annuler les désélectionner/sélectionner des événements?
Mise à jour: j'ai demandé à une question de suivi...
Comment puis-je gérer correctement un PreviewMouseDown événement avec une boîte de message de confirmation?
OriginalL'auteur Zack Peterson | 2009-02-12
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR
Réalisé que je pourrais mettre de la logique dans SelectedItemChanged à la place. Un peu plus propre solution.
Xaml
Code derrière. J'ai quelques classes qui est mon ItemsSource de l'Arborescence, j'ai donc fait une interface (MyInterface) qui expose la propriété IsSelected pour tous.
Je n'ai pas trouvé une situation où il ne veut pas revenir à l'élément précédent en appuyant sur "Non".
OriginalL'auteur Fredrik Hedblad
J'ai eu à résoudre le même problème, mais dans les multiples treeviews dans mon application. J'ai tiré TreeView et ajouté des gestionnaires d'événements, en partie à l'aide de Meleak de la solution et, en partie, à l'aide de l'extension des méthodes de ce forum: http://forums.silverlight.net/t/65277.aspx/1/10
J'ai pensé que je devais partager ma solution avec vous, alors voici mon complet réutilisable TreeView qui gère "annuler nœud de changement":
Voici un exemple d'utilisation (le code-behind pour fenêtre contenant un MyTreeView):
Après avoir choisi le premier nœud de l'arborescence, tous les autres noeuds les modifications sont annulées et une boîte de message s'affiche.
EventManager.RegisterClassHandler(typeof(MyTreeView), MyTreeView.PreviewSelectedItemChangedEvent, new RoutedPropertyChangedEventHandler<object>(theTreeView_PreviewSelectedItemChanged));
EventManager.RegisterClassHandler(typeof(MyTreeView), MyTreeView.SelectionCancelledEvent, new RoutedEventHandler(theTreeView_SelectionCancelled));
OriginalL'auteur Christian Myksvoll
Au lieu de sélectionner pour sélectionner/désélectionner, une meilleure solution pourrait être de s'accrocher dans PreviewMouseDown. Le preblem à la manipulation de l'Sélectionnés et non sélectionnés événement est que l'événement a déjà eu lieu lorsque vous recevez la notification. Il n'y a rien à annuler parce que c'est déjà arrivé.
D'autre part, l'Aperçu des événements sont annulables. Ce n'est pas l'exacte de l'événement que vous voulez, mais il ne vous donner la oppuritunity pour éviter à l'utilisateur de sélectionner un autre nœud.
Définir la propriété TreeView.Focusable pour faux et il n'est plus possible d'obtenir le focus à l'aide du clavier.
Mais que faire si ils sont censés être en mesure d'utiliser le clavier?
OriginalL'auteur JaredPar
Vous ne pouvez pas annuler l'épreuve comme vous pouvez, par exemple, un événement de Clôture. Mais vous pouvez l'annuler si vous le cache de la dernière valeur sélectionnée. Le secret est que vous devez changer la sélection sans re-tir de l'événement SelectionChanged. Voici un exemple:
Aussi avec TreeView vous ne pouvez pas définir l'élément sélectionné comme ça, vous devez définir IsSelected sur l'élément.
OriginalL'auteur AndyM
CAMS_ARIES:
XAML:
code :
OriginalL'auteur
Vous ne pouvez pas mettre votre logique dans le OnSelectedItemChanged Méthode, si la logique est là l'Élément Sélectionné a déjà changé.
Comme l'a suggéré une autre affiche, le PreviewMouseDown gestionnaire est un meilleur endroit pour mettre en œuvre la logique, cependant, un juste montant de la jambe de travail doit encore être fait.
Ci-dessous est mes 2 cents:
Première dans l'Arborescence que j'ai mis en œuvre:
certaines méthodes d'extension à l'appui de l'Arborescence de trouver l'objet en vertu de la souris.
et le dernier mais non le moins, la coutume EventArgs qui tirent parti de la RoutedEvent sous-système.
OriginalL'auteur nmadura
Depuis le
SelectedItemChanged
événement est déclenché après laSelectedItem
a déjà changé, vous ne pouvez pas vraiment d'annuler l'événement à ce point.Ce que vous pouvez faire est d'écouter pour des clics de souris et de les annuler avant la
SelectedItem
est changé.OriginalL'auteur Eclipse
Vous pouvez créer votre contrôle personnalisé qui découle de l'Arborescence, puis remplacer le OnSelectedItemChanged méthode.
Avant l'appel de la base, vous pouvez déclencher un événement personnalisé avec un CancelEventArgs paramètre. Si le paramètre.Annuler devenir vrai, alors ne pas appeler à la base, mais sélectionnez l'ancien élément à la place (attention à ce que la OnSelectedItemChanged sera appelée de nouveau).
Pas la meilleure solution, mais au moins cela permet de maintenir la logique à l'intérieur de l'arbre de contrôle, et il n'est pas par hasard que la sélection de l'événement de changement de feux plus que nécessaire. Aussi, vous n'avez pas besoin de soins si l'utilisateur a cliqué sur l'arbre, utilisé le clavier ou peut-être le changement de la sélection par programmation.
OriginalL'auteur Alex G
J'ai résolu ce problème pour 1 affichage de l'arborescence et l'affichage de 1 document à la fois. Cette solution est basée sur une saisissable comportement qui peut être attaché à une normale treeview:
et le code pour le comportement est ceci:
Dans cet exemple, je suis en train de montrer un blocage de la boîte de message dans le but de bloquer la PreviewMouseDown événement lorsqu'il se produit. L'événement est ensuite traitée pour signaler que la sélection est annulée ou n'est pas traitée à laisser le treeview lui-même gérer l'événement en sélectionnant l'élément qui est sur le point d'être sélectionné.
Le comportement invoque ensuite une commande de limite dans le viewmodel si l'utilisateur décide de continuer, de toute façon (PreviewMouseDown événement n'est pas géré par le comportement attaché et lié commande est invoquée.
Je suppose que la boîte de message indiquant pourrait être fait dans d'autres façons, mais je pense qu'il est essentiel ici de bloquer l'événement quand il se produit depuis sa sinon pas possible de l'annuler(?). Ainsi, l'améliorer, seulement je pouvais possible pensent à propos de ce code est de se lier à certaines chaînes de rendre le message qui s'affiche configurable.
J'ai écrit un article qui contient un échantillon téléchargeable depuis cela, c'est un domaine difficile à expliquer (on doit faire de nombreuses hypothèses sur les pièces manquantes et le peut pas toujours être partagé par tous les lecteurs)
Voici un article qui contient mes résultats:
http://www.codeproject.com/Articles/995629/Cancelable-TreeView-Navigation-for-Documents-in-WP
S'il vous plaît commentaire sur cette solution et laissez-moi savoir si vous voyez de la place pour de l'amélioration.
OriginalL'auteur user3313608