« KeyBinding » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
Ligne 58 : Ligne 58 :


= Keyboard Focus =
= Keyboard Focus =
Il est intéressant de définir le KF dans l'evt MyControl_Loaded
<filebox fn='MyControl.xaml'>
<kode lang="cs">
<UserControl Focusable="True">
// pour pouvoir avoir le KF, l'élément doit être Focusable
</filebox>
this.Focusable = true;
 
// tente de donner le KF à this. Retourne le composant qui a le KF
<filebox fn='MyControl.xaml.cs'>
var focusedElement = Keyboard.Focus(this);
public MyControl()
</kode>
{
    InitializeComponent();
    this.Loaded += (sender, args) => this.Focus();
}
</filebox>


= Capture des touches pressées =
= Capture des touches pressées =

Version du 11 avril 2021 à 09:18

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

Xaml.svg
<TextBox Text="{Binding InputValue, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Key="Enter"
                    Command="{Binding ValidateCmd}" />
    </TextBox.InputBindings>
</TextBox>

Window

Xaml.svg
<Window.InputBindings>
    <KeyBinding Key="A" Command="{Binding Path=KeyCommand}"
                CommandParameter="A"/>
</Window.InputBindings>
Cs.svg
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

MyControl.xaml
<UserControl Focusable="True">
MyControl.xaml.cs
public MyControl()
{
    InitializeComponent();
    this.Loaded += (sender, args) => this.Focus();
}

Capture des touches pressées

Cs.svg
// 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

Cs.svg
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

Cs.svg
private bool IsCtrlKeyDown()
{
    return (Keyboard.GetKeyStates(Key.LeftCtrl) & KeyStates.Down) > 0 || (Keyboard.GetKeyStates(Key.RightCtrl) & KeyStates.Down) > 0;
}