Appelez la commande lorsque la touche "ENTRÉE" est enfoncée dans XAML
Je veux invoquer une commande lorsque la touche ENTRÉE est pressée dans un TextBox
. Considérons le code XAML suivant:
<UserControl
...
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
...>
...
<TextBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<i:InvokeCommandAction Command="{Binding MyCommand}"
CommandParameter="{Binding Text}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
...
</UserControl>
et que MyCommand est comme suit:
public ICommand MyCommand {
get { return new DelegateCommand<string>(MyCommandExecute); }
}
private void MyCommandExecute(string s) { ... }
Ci-dessus, ma commande est invoquée pour chaque touche. Comment puis-je limiter l'utilisation de la commande à seulement invoquer lorsque la touche ENTRÉE est pressée?
Je comprends qu'avec Expression Blend que je peux utiliser, mais les Conditions de ceux qui semblent se limiter aux éléments et ne peut pas la considérer arguments d'événement.
J'ai également venir à travers SLEX qui dispose de sa propre InvokeCommandAction
de mise en œuvre qui est construit au-dessus de la Systems.Windows.Interactivity
mise en œuvre et peut faire ce dont j'ai besoin. Une autre considération est d'écrire mon propre déclencheur, mais j'espère que il y a un moyen de le faire sans l'utilisation des boîtes à outils.
source d'informationauteur bitxwise
Vous devez vous connecter pour publier un commentaire.
Il est KeyTrigger dans expression blend.
System.Windows.Interactivity
etMicrosoft.Expression.Interactions
assemblées sont disponibles pour WPF dans l'officiel Package Nuget.J'aime scottrudy de l'approche (à qui j'ai donné un +1) à la coutume des déclencheurs de l'approche qu'il reste fidèle à ma démarche initiale. Je suis, y compris une version modifiée ci-dessous pour utiliser les propriétés de dépendance à la place de la réflexion info, de sorte qu'il est possible de lier directement à la ICommand. Je suis aussi, y compris une approche utilisant les propriétés attachées à éviter l'utilisation de
System.Windows.Interactivity
si vous le souhaitez. L'inconvénient de cette approche est que vous perdez la fonction de multiples invokations à partir d'un événement, mais vous pouvez l'appliquer de façon plus générale.Personnalisé Déclenche Approche
ExecuteCommandAction.cs
TextBoxEnterKeyTrigger.cs
MyUserControl.xaml
Propriétés Attachées Approche
EnterKeyDown.cs
MyUserControl.xaml
Je suis tombé sur cette même question hier et résolu en utilisant des déclencheurs. Il peut sembler un peu trop au début, mais j'ai trouvé ce schéma général est utilisable pour faire beaucoup de choses que j'ai utilisé pour exécuter à l'aide de gestionnaires d'événements directement dans une vue (comme double-cliquez sur événements). La première étape est de créer un déclencheur d'action qui peuvent accepter un paramètre, car nous en aurons besoin plus tard.
La prochaine étape est de créer le déclencheur. Vous pourriez faire des choses intéressantes avec les classes de base pour le rendre plus générique pour la capture de différents types de touches, mais nous allons garder les choses simples.
Gardez à l'esprit que même si vous avez une liaison de données à la place de votre zone de texte valeur, la propriété a changé de cas ne se déclenche pas à cause de votre zone de texte n'a pas perdu le focus. Pour cette raison, je suis passant la valeur de la TextBox.Propriété Text de la commande. La dernière étape consiste à utiliser cette fonctionnalité dans votre XAML. Vous devez être sûr d'inclure l'Interactivité espace de l'espace de noms qui contient votre code à partir de ci-dessus.
J'ai utilisé scottrudy code dans mon application cependant, ma zone de texte le texte est lié à une propriété de classe viewmodel et cette propriété n'est pas l'obtention de mises à jour au moment de la commande est invoquée après pressiong touche ENTRÉE parce que ma zone de texte n'a pas perdu l'accent encore. Donc, à résolu ce problème, j'ai ajouté les extraits de code suivant juste au-dessus de InvokeActions(o) dans AssociatedObject_KeyUp méthode et mise à jour du texte de la propriété devient de jour en classe viewmodel.
Sur le dessus de mon esprit.. Vous pouvez passer événement args à la commande et que dans le ViewModel vérifier si l'e.KeyPress = Touches.Entrez.. ce n'est pas vraiment de code 🙂 je n'ai pas mon VS sur cet ordinateur.. c'est plutôt une idée 🙂