WPF, Събития за въвеждане на клавиатура
WPF --- WPF Foundation --- Събития за въвеждане на клавиатура
Когато потребителят натисне клавиш, се случва цяла поредица от събития. Таблицата изброява тези събития в реда на тяхното възникване:
Работата с клавиатурни събития не е толкова лесна, колкото звучи. Някои контроли могат да блокират някои от тези събития, за да извършат собствена работа с клавиатурата. Най-яркият пример е контролата TextBox, която блокира събитието TextInput, както и събитието KeyDown за натискане на определени клавиши, като клавишите с курсора. В такива случаи обикновено можете да използвате тунелирани събития (PreviewTextlnput и PreviewKeyDown).
Елементът TextBox добавя едно ново събитие, TextChanged. Това събитие се задейства веднага след натискане на клавиш, което води до промяна на текста в текстовото поле. В този момент обаче новият текст вече се вижда в текстовото поле, така че е твърде късно да отмените нежеланото натискане на клавиша.
Работа с натискане на клавиш
Пример е най-добрият начин да разберете как събитията на клавиатурата работят и се използват. По-долу е дадена примерна програма, която следи и регистрира всички възможни натискания на клавиши, когато фокусът е върху текстово поле. В този случай се показва резултатът от въвеждането на главна буква S.
Този пример демонстрира един важен момент. Събитията PreviewKeyDown и KeyDown се задействат при всяко натискане на клавиш. Събитието TextInput обаче се задейства само когато в елемента е "въведен" символ. Всъщност това може да означава натискане на много клавиши. В примера трябва да натиснете два клавиша, за да получите главна буква S: първо клавиш, след това клавиш. Това води до две събития KeyDown и KeyUp, но само едно събитие TextInput.
Събитията PreviewKeyDown, KeyDown, PreviewKey и KeyUp предават една и съща информация на обекта KeyEventArgs. Най-важната част от него е свойството Key, което връща стойност от изброяването System.Windows.Input.Key и идентифицира натиснатия или освободения бутон.
Стойността на ключа не отчита състоянието на който и да е друг ключ - например дали клавишът е бил натиснат в момента на натискане; така или иначе ще получите същата стойност на Key (Key.S).
Тук има едно усложнение. В зависимост от настройката на клавиатурата в Windows, задържането на клавиша води до повторения след кратък период от време. Например, натискането на клавиш ще доведе до въвеждане на поредица от S символи в текстовото поле. По същия начин, натискането на клавиш ще доведе до повторения и поредица от KeyDown събития. В пример от реалния свят, когато се натисне комбинация, текстовото поле ще задейства поредица от събития KeyDown за ключа, след това събитие KeyDown за ключа, събитие TextInput (или събитие TextChanged в случай на текстово поле) и след това събитието KeyUp за ключовете и. Ако искате да игнорирате повторения на натискане на клавиш, можете да проверите дали натискането е резултат от натискане на клавиш, като използвате свойството KeyEventArgs.IsRepeat.