Установка порядка табуляции в WPF

92

Как установить порядок вкладок в WPF? У меня есть ItemsControl, некоторые элементы которого развернуты, а некоторые свернуты, и я хотел бы пропустить свернутые, когда я использую табуляцию.

Любые идеи?

Римский
источник
Предложенный Джесси ответ - правильный путь ...
Роман
это похоже на поведение по умолчанию?
JonnyRaa
@ Роман, а кто такой Джесси?
Stealth Rabbi
1
@Stealth Rabbi: выбранный ответ. Название могло быть изменено (с 11 лет назад 😆)
Román

Ответы:

63

Вы можете пропустить элементы в последовательности вкладок, установив KeyboardNavigation.IsTabStop для элемента в XAML.

KeyboardNavigation.IsTabStop="False"

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

Джеб
источник
1
Вы также можете использовать Focusable = "False", который удаляет его из фокуса клавиатуры, а также из порядка табуляции.
Джефф Кокс
2
@Geoff Я сделал это с кучей кнопок, и это не сработало, просто fyi.
ToastyMallows
Это позволяет пропускать элементы управления, которые вы не хотите быть частью порядка вкладок, но в WPF есть много других проблем. Порядок вкладок не является иерархическим, поэтому, если на экране есть другие элементы управления, которые имеют нулевой порядок (что они делают по умолчанию), то порядок вкладок просто не будет работать.
Кристиан Финдли
90

Если вы хотите явно установить порядок табуляции для элементов в вашей форме, должно помочь следующее присоединенное свойство:

<Control KeyboardNavigation.TabIndex="0" ... />

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


Обратите внимание, что в Win RT свойство просто TabIndex="0".

Дрю Ноукс
источник
11
Уловка состоит в том, чтобы использовать TabIndex с различными значениями KeyboardNavigation.TabNavigation в родительском элементе. Я чаще всего использую "Local" TabNavigation. :)
Greg D
Мне пришлось добавить это к каждому из моих элементов управления, а не просто добавлять их к различным панелям StackPanel, на которых размещены указанные элементы управления.
DJ van Wyk
Я считаю, что настройка <DockPanel Panel.ZIndex="2">помогает упорядочить точку входа в панели верхнего уровня.
avenmore
25

<Control KeyboardNavigation.TabIndex="0" ... /> Работает отлично ... Например-

<ComboBox Height="23" 
          Margin="148,24,78,0" 
          Name="comboBoxDataSet"
          VerticalAlignment="Top"
          SelectionChanged="comboBoxDestMarketDataSet_SelectionChanged"
          DropDownOpened="comboBoxDestMarketDataSet_DropDownOpened"
          KeyboardNavigation.TabIndex="0" />
<ComboBox Height="23" 
          Margin="148,56,78,0" 
          Name="comboBoxCategory" 
          VerticalAlignment="Top" 
          SelectionChanged="comboBoxDestCategory_SelectionChanged"
          DropDownOpened="comboBoxDestCategory_DropDownOpened"
          KeyboardNavigation.TabIndex="1" />

Позволит вам перемещаться по этим двум полям со списком с помощью клавиши TAB.

Панкадж
источник
13

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

KeyboardNavigation.TabNavigation="Cycle"

Это также автоматически игнорирует свернутые вкладки.

AltF4_
источник
6

Другая альтернатива, которая работала для меня в прошлом, - просто удалить все явные TabIndexоператоры и позволить элементам управления использовать порядок, который они объявлены в XAML, творить чудеса.

Это, конечно, может потребовать от вас изменения порядка элементов управления. Но это простая операция копирования и вставки.

Густаво Мори
источник
5
Проблема в том, что вы не можете просто изменить порядок элементов управления в таких вещах, как DockPanels, где порядок, в котором вы их добавляете, не соответствует порядку табуляции. Например, рассмотрим кнопки стыковки справа. Вы стыкуете сначала последний, второй - последний и т. Д., Но вы хотите, чтобы порядок табуляции был обратным. Это то, что меня больше всего сбивает с толку. В такие моменты я скучаю по старым дням VB6 (не по языку, а только по этой функции), когда вы выбираете «Установить порядок вкладок» и просто щелкаете по всем элементам управления. Просто и мило. К сожалению, у нас в 2018 году ничего подобного нет.
Марк А. Донохо
1
@Mark или 2020 :). Упорядочивание вкладок в WPF безумно сложно, всякий раз, когда мне нужно настраиваемое упорядочение, я должен весь день бороться с его непредсказуемостью. В Winforms это была рутинная задача, которая занимала несколько минут на каждое окно.
Бокибег
0

Вы можете использовать KeyboardNavigation.TabNavigation = "None", чтобы полностью пропустить переход на вкладку для определенного элемента управления.

user2306815
источник