« KeyBinding » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
Ligne 58 : | Ligne 58 : | ||
= Keyboard Focus = | = Keyboard Focus = | ||
== Behavior == | |||
<filebox fn='FocusBehavior.cs'> | |||
public sealed class FocusBehavior : Behavior<UserControl> | |||
{ | |||
protected override void OnAttached() | |||
{ | |||
AssociatedObject.Focusable = true; | |||
AssociatedObject.Loaded += OnLoaded; | |||
} | |||
protected override void OnDetaching() | |||
{ | |||
AssociatedObject.Loaded -= OnLoaded; | |||
} | |||
private void OnLoaded(object sender, RoutedEventArgs e) | |||
{ | |||
AssociatedObject.Focus(); | |||
} | |||
} | |||
</filebox> | |||
<filebox fn='MyControl.xaml'> | |||
<UserControl xmlns:b="http://schemas.microsoft.com/xaml/behaviors" | |||
xmlns:behaviors="clr-namespace:MyApp.Behaviors"> | |||
<b:Interaction.Behaviors> | |||
<behaviors:FocusBehavior /> | |||
</b:Interaction.Behaviors> | |||
</filebox> | |||
== Code behind == | |||
<filebox fn='MyControl.xaml'> | <filebox fn='MyControl.xaml'> | ||
<UserControl Focusable="True"> | <UserControl Focusable="True"> |
Version du 11 avril 2021 à 09:40
KeyBinding
Branchement de touches du clavier avec des Commands.
Le composant doit avoir le Keyboard Focus pour que les entrées clavier soient capturées.
TextBox
<TextBox Text="{Binding InputValue, UpdateSourceTrigger=PropertyChanged}"> <TextBox.InputBindings> <KeyBinding Key="Enter" Command="{Binding ValidateCmd}" /> </TextBox.InputBindings> </TextBox> |
Window
<Window.InputBindings> <KeyBinding Key="A" Command="{Binding Path=KeyCommand}" CommandParameter="A"/> </Window.InputBindings> |
public RelayCommand KeyCommand { get; set; } KeyCommand = new RelayCommand( param => { switch ((string)param) { case "A": Background = Brushes.AliceBlue; break; case "Z": Background = Brushes.AntiqueWhite; break; } }); |
Attention : Le Binding de type ElementName ne semble pas fonctionner avec KeyBinding.
Key Enum
Value | Code | Description |
---|---|---|
Back | 2 | The Backspace key |
NumPad0 | 74 | The 0 key on the numeric keypad |
Decimal | 88 | The Decimal key . , |
Add | 85 | The Add key + |
Keyboard Focus
Behavior
FocusBehavior.cs |
public sealed class FocusBehavior : Behavior<UserControl> { protected override void OnAttached() { AssociatedObject.Focusable = true; AssociatedObject.Loaded += OnLoaded; } protected override void OnDetaching() { AssociatedObject.Loaded -= OnLoaded; } private void OnLoaded(object sender, RoutedEventArgs e) { AssociatedObject.Focus(); } } |
MyControl.xaml |
<UserControl xmlns:b="http://schemas.microsoft.com/xaml/behaviors" xmlns:behaviors="clr-namespace:MyApp.Behaviors"> <b:Interaction.Behaviors> <behaviors:FocusBehavior /> </b:Interaction.Behaviors> |
Code behind
MyControl.xaml |
<UserControl Focusable="True"> |
MyControl.xaml.cs |
public MyControl() { InitializeComponent(); this.Loaded += (sender, args) => this.Focus(); } |
Capture des touches pressées
// capture les touches pressées qui ne sont pas déjà capturées par des sous-controls. KeyDown += new KeyEventHandler(MonControl_KeyDown); // avec le paramètre handledEventsToo à true, capture toutes les touches pressées même celles qui sont pas déjà capturées par des sous-controls. AddHandler(UIElement.PreviewKeyDownEvent, new KeyEventHandler(MonControl_PreviewKeyDown_EventHandled), true); private void MonControl_PreviewKeyDown_EventHandled(object sender, KeyEventArgs e) { // gestion des touches systèmes comme F10 qui affiche le menu // cette touche se trouve dans e.SystemKey au lieu de e.Key qui contient Key.System var key = e.Key == Key.System ? e.SystemKey : e.Key, e); } |
Convertion String → Key
Key myKey; if (Enum.TryParse("Subtract", true, out myKey)) { } var keyConverter = new KeyConverter(); var myKey = keyConverter.ConvertFromString("Subtract"); |
Tester si la touche Ctrl est pressée
private bool IsCtrlKeyDown() { return (Keyboard.GetKeyStates(Key.LeftCtrl) & KeyStates.Down) > 0 || (Keyboard.GetKeyStates(Key.RightCtrl) & KeyStates.Down) > 0; } |