Поддерживать порядок вкладок при нажатии клавиш - PullRequest
0 голосов
/ 12 марта 2012

Я новичок в WPF, и в моем приложении я хочу поддерживать порядок вкладок с помощью клавиш навигации (клавиши со стрелками вверх / вниз).поэтому я повторяю каждый элемент управления в сетке при событии загрузки окна и добавляю делегата следующим образом

private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            foreach (UIElement element in gridChild.Children)
            {
                if (element.GetType() == typeof(TextBox))
                {
                    TextBox tb1 = (TextBox)element;
                    tb1.PreviewKeyUp += TextBox_KeyDown;
                }
                else if (element.GetType() == typeof(PasswordBox))
                {
                    PasswordBox tb1 = (PasswordBox)element;
                    tb1.PreviewKeyUp += TextBox_KeyDown;
                }
                else if (element.GetType() == typeof(Button))
                {
                    Button tb1 = (Button)element;
                    tb1.PreviewKeyDown += TextBox_KeyDown;
                }
            }
}

, а обработчик следует

private void TextBox_KeyDown(Object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Down || (e.Key == Key.Enter && sender.GetType()!=typeof(Button))  )
            {
                e.Handled = true;
                UIElement focusedElement = Keyboard.FocusedElement as UIElement;
                if (focusedElement != null)
                {
                    focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }



            }
            else if (e.Key == Key.Up)
            {



                e.Handled = true;
                UIElement focusedElement = Keyboard.FocusedElement as UIElement;
                if (focusedElement != null)
                {
                    focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
                }
            }
        }

, он хорошо работает, когда я использую клавиши навигации, за исключением одной проблемы.Проблема заключается в том, что при нажатии навигационных клавиш вверх или вниз на кнопке пропускается одно текстовое поле, следующее в порядке табуляции.Я не уверен, что не так с приведенным выше кодом.Пожалуйста, предложите, что я должен сделать для поддержания порядка табуляции с помощью клавиш навигации.

1 Ответ

1 голос
/ 12 марта 2012

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 обработчик. Что если вы добавите некоторые элементы управления в это окно в будущем? Вам также не придется забывать добавлять код. Что если в вашем приложении появится новое окно? Вам придется продублировать этот блок кода.

...