Raccourci clavier dans UserControl ne fonctionne pas lorsque la zone de texte a le focus
La situation suivante. J'ai un UserControl avec cinq raccourcis clavier. Lorsque la zone de texte a le focus les raccourcis clavier de l'objet UserControl cesser le tir..
Est-il un moyen de corriger ce "problème"?
<UserControl.InputBindings>
<KeyBinding Key="PageDown" Modifiers="Control" Command="{Binding NextCommand}"></KeyBinding>
<KeyBinding Key="PageUp" Modifiers="Control" Command="{Binding PreviousCommand}"></KeyBinding>
<KeyBinding Key="End" Modifiers="Control" Command="{Binding LastCommand}"></KeyBinding>
<KeyBinding Key="Home" Modifiers="Control" Command="{Binding FirstCommand}"></KeyBinding>
<KeyBinding Key="F" Modifiers="Control" Command="{Binding SetFocusCommand}"></KeyBinding>
</UserControl.InputBindings>
<TextBox Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Gesture="Enter" Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl }}, Path=DataContext.FilterCommand}"></KeyBinding>
</TextBox.InputBindings>
</TextBox>
Il semble touches de fonction (F1, etc) et ALT+[touche] faire le travail. Je suppose que la CTRL et MAJ modificateurs sont en quelque sorte "blocage" l'évènement de remonter à l'objet UserControl.
- zone de texte est à l'intérieur de l'objet usercontrol?
- exactement. Le contrôle UserControl est le conteneur et (dans cet exemple) une zone de texte est à l'intérieur. Il travaille également pour la zone de liste déroulante, DataGrid, etc.
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle certains d'entrée fixations de travail, et certains ne font pas, c'est que le contrôle de zone de captures et gère les raccourcis clavier. Par exemple, il gère CTRL+V pour la pâte, CTRL+Accueil pour aller au début du texte, etc. D'autres combinaisons de touches telles que CTRL+F3 d'autre part, ne sont pas gérées par la zone de texte, et donc ils vont remonter.
Si vous souhaitez voulais juste désactiver la zone de texte de saisie de liaison, ce serait simple - vous pouvez utiliser le
ApplicationCommands.NotACommand
de commande, qui peut désactiver le comportement par défaut. Par exemple, dans le cas suivant, le collage avec CTRL+V sera désactivé:Cependant, la faisant remonter jusqu'à l'utilisateur le contrôle est un peu plus compliqué. Ma suggestion est de créer un joint comportement qui sera appliqué pour le contrôle UserControl, inscrire à son
PreviewKeyDown
de l'événement, et l'exécution de son entrée liaisons nécessaires avant qu'ils n'atteignent la zone de texte. Cela donne la priorité à l'objet UserControl lors de l'entrée liaisons sont exécutées.J'ai écrit un comportement de base qui permet d'obtenir cette fonctionnalité pour vous aider à démarrer:
Utilisation:
Espère que cette aide.
kb => kb.Key == Key.Enter
. J'ai aussi remplacéKey
dansKeyBinding
deHome
àEnter
. Et suppriméModifiers
. Ma zone de texte réside à l'intérieur de DataGridColumnHeader. Ainsi, j'ai appliqué la propriété attachée à la grille de données. Maintenant, lorsque j'appuie sur une touche autre que de Saisir, par exemple, pour la Touche Flèche Bas, la commande des feux. Je veux juste que ma Commande à feu lorsque j'appuie sur la Touche Enter. Pouvez-vous nous apporter quelques modifications au code mentionné ci-dessus????InputBindingsBehavior
instance sera libéré dès que leUIElement
n'est plus référencé à partir de n'importe où ailleurs.Dja de Lester solution fonctionne bien. Voici une solution similaire à l'aide de Comportement.
Le code C#:
Et le code XAML:
En plus de Adi Lester son (très utile) de la réponse, je voudrais suggérer quelques améliorations/extensions qui m'a aidé avec ma mise en œuvre.
Geste.Les matchs
La foundBinding peut également être fait en appelant le Geste.Les matchs. Modifier la foundBinding requête Linq pour les éléments suivants:
MouseBinding
En outre, vous pouvez également définir MouseBindings.
Ensuite, vous devez également vous abonner à PreviewMouseEvents par exemple PreviewMouseUp et PreviewMouseDoubleClick. La mise en œuvre est presque le même que pour les Raccourcis clavier.
keyPressPlaceHoler
est le nom du conteneur de votre cibleuielement
n'oubliez pas de régler le
Focusable="True"
dans usercontrol