J'ai un champ de recherche dans mon application WPF avec un bouton de recherche qui contient une commande de liaison. Cela fonctionne très bien, mais comment puis-je utiliser la même commande de liaison pour le champ de texte en appuyant sur Entrée sur le clavier? Les exemples que j'ai vus utilisent tous le code derrière avec un gestionnaire d'événements KeyDown. Y a-t-il une manière intelligente de faire fonctionner ceci seulement avec xaml et la commande de liaison?WPF: Exécuter une commande de liaison dans un champ de recherche en appuyant sur le bouton Entrée
Répondre
Vous pouvez utiliser la propriété IsDefault du bouton:
<Button Command="SearchCommand" IsDefault="{Binding ElementName=SearchTextBox,
Path=IsKeyboardFocused}">
Search!
</Button>
L'implémentation de référence Prism contient une implémentation de ce que vous cherchez exactement.
Les bases étapes sont les suivantes:
- Créer une classe statique EnterKey
- propriété attachée Registered "Commande" de type ICommand sur EnterKey
- propriété attachée Registered "EnterKeyCommandBehavior" de type EnterKeyCommandBehavior sur EnterKey
- Lorsque la valeur de "Command" change, attachez "EnterKeyCommandBehavior" au contrôle en tant que nouvelle instance de EnterKeyCommandBehavior et affectez l'ICommand à la propriété Command du comportement.
- Si le comportement est déjà fixé, utilisez l'instance existante
- EnterKeyCommandBehavior accepte un UIElement dans le constructeur et attache à la PreviewKeyDown (ou KeyDown si vous voulez rester compatible Silverlight).
- Dans le gestionnaire d'événements, si la clé est Entrée, exécutez l'ICommand (si CanExecute a la valeur true).
Cela vous permet d'utiliser le comportement comme ceci:
<TextBox prefix:EnterKey.Command="{Binding Path=SearchCommand}" />
La réponse acceptée ne fonctionne que si vous avez déjà un bouton lié à la commande.
Pour éviter cette limitation, utilisez TextBox.InputBindings:
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding Path=MyCommand}"></KeyBinding>
</TextBox.InputBindings>
Merci pour la mise à jour –
Cela a fonctionné pour moi. – Garry
J'ai également dû modifier UpdateSourceTrigger sur ma liaison TextBox.Text pour que cela fonctionne. Pour plus de détails, consultez [Capture de la touche Entrée dans un TextBox] (http://stackoverflow.com/a/5556526/744014). – Scott
J'ai essayé la solution TextBox.Inputs de Greg Samson, mais nous avons eu une erreur en disant que je ne pouvais lier à textinputs par une propriété de dépendance . En fin de compte, j'ai trouvé la solution suivante pour cela.
Créer une classe appelée CommandReference qui ressemble à ceci:
public class CommandReference : Freezable, ICommand
{
public CommandReference()
{
//
}
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
#region ICommand Members
public bool CanExecute(object parameter)
{
if (Command != null)
return Command.CanExecute(parameter);
return false;
}
public void Execute(object parameter)
{
Command.Execute(parameter);
}
public event EventHandler CanExecuteChanged;
private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
CommandReference commandReference = d as CommandReference;
ICommand oldCommand = e.OldValue as ICommand;
ICommand newCommand = e.NewValue as ICommand;
if (oldCommand != null)
{
oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
}
if (newCommand != null)
{
newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
}
}
#endregion
#region Freezable
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
#endregion
}
En XAML ajouter ceci aux ressources UserControl:
<UserControl.Resources>
<Base:CommandReference x:Key="SearchCommandRef" Command="{Binding Path = SomeCommand}"/>
La TextBox réelle ressemble à ceci:
<TextBox Text="{Binding Path=SomeText}">
<TextBox.InputBindings>
<KeyBinding Command="{StaticResource SearchCommandRef}" Key="Enter"/>
</TextBox.InputBindings>
</TextBox>
Je ne me souviens pas d'où j'ai eu ce code, mais ce site l'explique aussi;
- 1. En appuyant sur une touche dans C#
- 2. La soumission d'un formulaire sur un contrôle utilisateur en appuyant sur Entrée dans un champ de texte ne fonctionne pas
- 3. Comment composer un numéro en appuyant sur un bouton d'appel dans une application iPhone?
- 4. Problème de mise à jour de la ligne Gridview en appuyant sur Entrée
- 5. En appuyant sur le bouton retour UINavigationController lors de la frappe
- 6. (WPF) Liaison de deux classes à une commande
- 7. Liaison à une commande dans une grille de données
- 8. Action par défaut sur les pages JSF (c'est-à-dire en appuyant sur Entrée dans les champs de saisie)
- 9. jqGrid: Est-il possible de valider un changement de cellule en appuyant sur Tab au lieu d'appuyer sur Entrée?
- 10. Comment détecter le clic droit de la souris tout en appuyant sur le bouton gauche de la souris dans IE?
- 11. Déclenchement d'une fonction en appuyant sur une touche si aucune entrée n'est sélectionnée
- 12. ASP.NET Appelez la fonction javascript en appuyant sur la touche Entrée
- 13. En utilisant Python pour exécuter une commande sur chaque fichier dans un dossier
- 14. Recherche de plusieurs termes dans un champ
- 15. Notification d'erreur de liaison de liaison de données WPF
- 16. Liaison de données WPF: activer/désactiver un contrôle basé sur le contenu de var?
- 17. Entrée de ligne de commande MyGeneration
- 18. Zone de texte WPF qui met uniquement à jour la liaison lorsque vous appuyez sur Entrée
- 19. Comment enregistrer les rangées réordonnées uniquement en appuyant sur le bouton Terminé?
- 20. Comment utiliser un champ d'index pour supprimer une entrée?
- 21. Existe-t-il un moyen de formater un tampon python complet dans emacs en appuyant sur une touche?
- 22. Comment bloquer la soumission d'un formulaire en appuyant sur la touche Entrée ou Retour?
- 23. Comment faire Entrée sur un TextBox agir comme bouton TAB
- 24. wpf usercontrol, lie le paramètre de commande du bouton au contrôle usager parent
- 25. Annulation de l'appel sur le thread en appuyant sur ctrl + c
- 26. Champ de recherche
- 27. AJAX: Comment soumettre le bouton après avoir appuyé sur "Entrée"?
- 28. Wpf Entrée de données Formulaire lié à datable
- 29. WPF - Commande dans un objet MenuItem dans un DataTemplate
- 30. Comment renvoyer la valeur dans un champ en fonction de la valeur de recherche dans un autre champ
Merci, facile et propre. Fonctionne très bien! –
Merci pour ça! – abramlimpin
Que faire si vous n'avez pas de bouton? – ihake