Переключиться на следующую вкладку при нажатии клавиши Tab при последнем управлении TabItem

#.net #wpf #vb.net #tabs

#.net #wpf #vb.net #вкладки

Вопрос:

Я создаю настольное приложение с использованием WPF, где у меня есть окно с несколькими кнопками и элемент управления вкладками с динамически создаваемыми элементами нескольких вкладок. В каждом элементе вкладки много элементов управления.

Я хочу перейти к следующему элементу вкладки после того, как tab нажмет последний элемент управления на моем текущем элементе вкладки. Прямо сейчас он просто перебирает все элементы управления во всем окне и в том же элементе вкладки. Я установил индексы вкладок и попытался настроить KeyboardNavigation.TabNavigation=»Один раз», а также Local, Cycle, Continue и т. Д. Но это не помогло.

Как показано на рисунке ниже, когда я нажимаю tab на «Дата ареста», я хочу перейти к первому элементу управления на вкладке «Техас», но он просто вернется к элементу управления «Имя» на той же вкладке.

Перейти на следующую вкладку при нажатии клавиши tab

Ответ №1:

При нажатии Control Tab отображается следующая вкладка, и первый элемент управления на этой вкладке будет иметь фокус. Для перехода назад используйте Control Shift Tab .

Ответ №2:

На ваших вкладках должно быть Name установлено свойство ( x:Name in XAML ). У «последнего» элемента на вкладке также должно Name быть установлено свойство.

Теперь установите TabControl событие объекта KeyDown (или KeyUp ):

 Debug.WriteLine("key pressed: "   e.Key);
if (e.Key == Key.Tab)
{
    if (btnButton.IsFocused) tab2.Focus();
}
  

Это Debug.WriteLine(...) нужно только для того, чтобы убедиться, что ключ захвачен, прокомментировать или удалить эту строку, как только все заработает.

Для последовательного просмотра вкладок требуется несколько дополнительных строк кода. Вот полное KeyDown событие:

 private void tabControl_KeyDown(object sender, KeyEventArgs e)
{
    Debug.WriteLine("key pressed: "   e.Key);
    if (e.Key == Key.Tab)
    {
        var tabs = tabControl.Items.Cast<TabItem>().ToArray();

        var tab=tabs.Select((t, i)=>new {i, t}).SingleOrDefault(t => t.t.IsSelected); // one has to be selected. result is null of no tabs are present (then why have a tab control?)

        if (tab == null) return;
        switch (tab.i)
        {
            case 0:
                if (btnButton.IsFocused)
                    tab2.Focus();
                break;
            case 1:
                tab3.Focus();
                break;
            case 2:
                tab4.Focus();
                break;
            case 3:
                tab1.Focus(); // jump to first?
                // OR do something else
                break;
            default:
                break;
        }
    }
}
  

btnButton Замените свой «последний» элемент в форме.

Комментарии:

1. Я думал об этом подходе, и это сработает, но для этого мне нужно вручную определить элементы управления, которые являются последними, а также выяснить, какая вкладка следующая в каждом элементе вкладки, что может быть не сложно в общем сценарии, но в моем случае все вкладки генерируются динамически и отличаются в зависимости от некоторыхпараметры, определенные заказчиком. Таким образом, порядок вкладок может быть разным для всех клиентов. Кроме того, вкладки могут даже не добавляться в некоторых сценариях, например, если клиент не хочет или не имеет систему отпечатков пальцев, вкладка «Отпечаток пальца» не будет сгенерирована. (Продолжение ..)

2. Аналогично, элементы управления на каждой вкладке также могут присутствовать или отсутствовать в зависимости от различных параметров и режимов приложения. Это затрудняет поиск последнего элемента управления в элементе tab. Больше всего, если я не буду хорошим подходом для определения всего этого вручную. Итак, мне было интересно, есть ли что-то, что wpf предоставляет встроенным для этого? Спасибо!

3. Вы могли бы сделать это для KeyDown события (или KeyUp ) конкретного последнего элемента управления, вместо того, чтобы делать это для самого TabControl себя. Тогда это будет буквально однострочный, что-то вроде if (e.Key==Key.Tab) tabX.Focus(); где tabX находится вкладка, которую вы хотите активировать.

4. Я делаю это, используя концепцию, предоставленную вами на данный момент, но оставляя вопрос открытым на случай, если есть другие способы. Спасибо!