WPF — Вкладка для работы внутри текстового поля — не для выбора других элементов пользовательского интерфейса

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

Я создаю пользовательское текстовое поле даты и хочу, чтобы оно вело себя (делая это в коде):

При фокусировке он устанавливает текст в текущую дату и время, формат: дд.ММ.гггг и выбирает часть «dd». (т.е.SelectionStart = 0, т.е.SelectionLength = 2).

Затем я хочу нажать tab, чтобы изменить выделение на часть «ММ». (t.SelectionStart = 3; t.SelectionLength = 2;)

[«t» — текущее текстовое поле]

Код, который у меня есть:

     private void DateTextBox_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        TextBox t = sender as TextBox;
        if(e.Key == Key.Tab)
        {
            if(t.SelectionStart == 0)
            {
                t.SelectionStart = 3; t.SelectionLength = 2;
            } else if(t.SelectionStart == 3)
            {
                t.SelectionStart = 6; t.SelectionLength = 4;
            } else
            {
                t.SelectionStart = 0; t.SelectionLength = 2;
            }
            e.Handled = false;
        }
    }
  

Пробовал e.Обработал false и true. Ничего не изменилось.

Теперь он ведет себя так: я нажимаю на предыдущий элемент управления (текстовое поле тоже), нажимаю Tab, фокус переходит к этому текстовому полю, другое событие устанавливает выделение для первых двух символов, снова нажимаю Tab, фокус переходит к следующему элементу пользовательского интерфейса.

Как заставить Tab работать только в этом текстовом поле, как только туда попадет фокус?

Ответ №1:

Хорошо, измените PreviewKeyUp на PreviewKeyDown, и это сработает. Действие нажатия кнопки Tab вызвало пользовательский интерфейс для фокусировки на следующем элементе пользовательского интерфейса до того, как могло сработать событие PreviewKeyUp.