Configurando a ordem das guias no WPF

92

Como eu defino a ordem das guias no WPF? Eu tenho um ItemsControl com alguns itens expandidos e outros recolhidos e gostaria de pular os recolhidos quando estou tabulando.

Alguma ideia?

Romano
fonte
A resposta proposta por Jesse é o caminho a seguir ...
Román
esse parece ser o comportamento padrão?
JonnyRaa
@ Román quem é Jesse?
Stealth Rabino
1
@Stealth Rabbi: a resposta selecionada. O nome pode ter mudado (de 11 anos atrás 😆)
Román

Respostas:

63

Você pode ignorar elementos na sequência de guias definindo KeyboardNavigation.IsTabStop no elemento em XAML.

KeyboardNavigation.IsTabStop="False"

Você pode configurar um gatilho que alterne essa propriedade com base no estado expandido.

Jab
fonte
1
Você também pode usar Focusable = "False", o que o remove do foco do teclado, bem como da ordem das guias.
Geoff Cox
2
@Geoff Eu fiz isso com um monte de botões e não funcionou, só pra constar.
ToastyMallows de
Isso permite pular os controles que você não deseja que façam parte da ordem das guias, mas existem muitos outros problemas no WPF. A ordenação das guias não é hierárquica, portanto, se houver outros controles na tela que tenham uma ordenação zero (o que eles fazem por padrão), a ordenação das guias simplesmente não funcionará.
Christian Findlay
90

Se você deseja definir explicitamente a ordem das guias para os elementos do formulário, a seguinte propriedade anexada deve ajudar:

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

Digo "supostamente ajuda" porque não o achei muito confiável, embora provavelmente precise ler mais sobre como ele deve ser usado. Eu só posto esta resposta incompleta porque ninguém mais mencionou esta propriedade.


Observe que no Win RT, a propriedade é justa TabIndex="0".

Drew Noakes
fonte
11
O truque é usar TabIndex com vários valores de KeyboardNavigation.TabNavigation no elemento pai. Eu me encontro usando o TabNavigation "Local" com mais freqüência. :)
Greg D,
Tive que adicionar isso a cada um dos meus controles, em vez de apenas adicioná-los aos diferentes StackPanels que hospedam os referidos controles.
DJ van Wyk
Acho que a configuração <DockPanel Panel.ZIndex="2">ajuda a solicitar o ponto de entrada dos painéis de nível superior.
avenmore
25

<Control KeyboardNavigation.TabIndex="0" ... /> Funciona perfeitamente bem ... Por exemplo-

<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" />

Permitirá que você navegue por essas duas caixas de combinação usando a tecla TAB.

Pankaj
fonte
13

Acho que há uma solução muito mais fácil aqui, no topo de seu controle ou janela ou qualquer outra coisa, você pode adicionar:

KeyboardNavigation.TabNavigation="Cycle"

Isso também ignora automaticamente as guias recolhidas.

AltF4_
fonte
6

Outra alternativa que funcionou para mim no passado é simplesmente remover todas as TabIndexinstruções explícitas e deixar os controles usarem a ordem em que são declarados no XAML para fazer sua mágica.

Isso, é claro, pode exigir que você reordene seus controles. Mas esta é uma operação simples de copiar e colar.

Gustavo Mori
fonte
4
O problema é que você não pode simplesmente reordenar os controles em coisas como DockPanels, onde a ordem em que você os adiciona não corresponde à ordem das guias. Por exemplo, considere os botões de encaixe à direita. Você acopla o último primeiro, o penúltimo segundo, etc., mas deseja que a ordem das guias seja invertida. Isso é o que mais me atrapalha. Em tempos como este, sinto falta dos velhos tempos do VB6 (não do idioma, apenas desse recurso) em que você escolhe 'Definir ordem das guias' e apenas clica em todos os seus controles. Simples e doce. Frustrante, não temos nada parecido aqui em 2018.
Mark A. Donohoe
0

Você pode usar KeyboardNavigation.TabNavigation = "None" para pular completamente a Tabulação para controle específico.

user2306815
fonte