TabOrder вызывается так, потому что фокус переключается между элементами управления клавишей Tab, а не клавишами со стрелками. Ваши проблемы вызваны тем, что некоторые элементы управления могут подавлять события клавиш со стрелками, такие как TextBox в вашем случае. Но на самом деле вы можете преодолеть это, добавив обработчик событий следующим образом:
textBox.AddHandler(TextBox.KeyDownEvent,
new KeyEventHandler(TextBox_KeyDown),
handledEventsToo: true);
TextBox обрабатывает клавиши со стрелками вниз, потому что использует эти клавиши в текстовой навигации. Поэтому TextBox обрабатывает их (перемещает курсор) и устанавливает e.Handled = true
, что останавливает событие от всплывающего - вот почему вы не перехватываете это событие.
Но, как я уже сказал, навигация с помощью клавиш со стрелками может разочаровать пользователя. Вы можете перемещаться с помощью клавиши Tab. WPF полностью поддерживает этот подход и даже сам устанавливает индексы вкладок, так что фокус перемещается слева направо, а затем сверху вниз в окне, когда пользователь нажимает клавишу Tab. Вы можете предотвратить фокусировку элемента управления с помощью клавиши Tab, установив для свойства IsTabStop
значение false. Также вы можете определить свой собственный порядок вкладок, установив свойство TabIndex
элементов. Для работы этого подхода не требуется никакого кода.
Еще одна причина, по которой вы предпочитаете этот подход тому, который вы реализовали, заключается в том, что ваш код сложно поддерживать. Посмотрите на ваш Window_Loaded
обработчик. Что если вы добавите некоторые элементы управления в это окно в будущем? Вам также не придется забывать добавлять код. Что если в вашем приложении появится новое окно? Вам придется продублировать этот блок кода.