Na pierwszy rzut oka może się wydawać, że Silverlight nie pozwala na „przechwytywanie” i obsługę wciskania wielu klawiszy jednocześnie np: CTRL + C, ALT + X itd. Ale to tylko pierwsze wrażenie. Poniżej opiszę jak radzić sobie z tym problemem.
Jeden klawisz
Obsługa jednego klawisza jest dziecinnie prosta. Wpinamy się interesującej nas kontrolce w zdarzenie KeyDown lub KeyUp, a następnie analizujemy argument KeyEventArgs:
private void myControl_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) { e.Handled = true; // ESC was pressed! // close window } }
Typ Key jest enum’em, który zawiera litery, cyfry, znaki, klawisze specjalne i inne. Ale co jeśli potrzebujemy funcjonalność a’la copy & paste?
Kombinacje klawiszy
Aby obsługiwać kombinacje klawiszy typu: CTRL+F (szukaj) musimy nieco zmodyfikować nasz kod obsługi zdarzenia KeyDown/KeyUp i użyć Keyboard Modifiers:
private void myControl_KeyDown(object sender, KeyEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.F) { e.Handled = true; // CTRL + F was pressed! // find something } }
Pingback: dotnetomaniak.pl
Post ten wypada uzupełnić o następujące wiadomości
Enum Key zawiera tylko małą część wszystkich znaków z klawiatury. Ale da się to obejść przez właściwość PlatformKey parametru typu KeyEventArgs. Dodatkowo nie KeyDown działa tak jakby się tego oczekiwało (np. KeyDown potrafi nie widzieć Delete i BackSpace) Wtedy przydatna jest metoda:
AddHandler(FrameworkElement.KeyDownEvent, new KeyEventHandler(MetodaObsługi), true);