KeyBinding

De Banane Atomic
Révision datée du 4 mars 2019 à 23:45 par Nicolas (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

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.

Keyboard Focus

Il est intéressant de définir le KF dans l'evt MyControl_Loaded

Cs.svg
// pour pouvoir avoir le KF, l'élément doit être Focusable
this.Focusable = true;
// tente de donner le KF à this. Retourne le composant qui a le KF
var focusedElement = Keyboard.Focus(this);

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;
}