Définition de l'ordre de tabulation dans WPF


92

Comment définir l'ordre des onglets dans WPF? J'ai un ItemsControl avec certains éléments développés et d'autres réduits et je voudrais ignorer ceux réduits lorsque je tabule.

Des idées?


La réponse proposée par Jesse est la voie à suivre ...
Román

cela semble être le comportement par défaut?
JonnyRaa

@ Román qui est Jesse?
Stealth Rabbi

1
@Stealth Rabbi: la réponse choisie. Le nom a peut-être changé (il y a 11 ans 😆)
Román

Réponses:


63

Vous pouvez ignorer des éléments dans la séquence d'onglets en définissant KeyboardNavigation.IsTabStop sur l'élément en XAML.

KeyboardNavigation.IsTabStop="False"

Vous pouvez configurer un déclencheur qui basculerait cette propriété en fonction de l'état développé.


1
Vous pouvez également être Focusable = "False" qui le supprime du focus clavier ainsi que de l'ordre des tabulations.
Geoff Cox

2
@Geoff J'ai fait ça avec un tas de boutons et ça n'a pas fonctionné, juste pour info.
ToastyMallows

Cela permet d'ignorer les contrôles que vous ne souhaitez pas faire partie de l'ordre des onglets, mais il existe de nombreux autres problèmes dans WPF. L'ordre des onglets n'est pas hiérarchique, donc s'il y a d'autres contrôles à l'écran qui ont un ordre zéro (ce qu'ils font par défaut), l'ordre des onglets ne fonctionnera tout simplement pas.
Christian Findlay

90

Si vous souhaitez définir explicitement l'ordre de tabulation des éléments de votre formulaire, la propriété jointe suivante est censée vous aider:

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

Je dis "censé aider" car je ne l'ai pas trouvé très fiable mais j'ai probablement besoin d'en savoir plus sur la façon dont il est censé être utilisé. Je ne poste que cette réponse à moitié cuite car personne d'autre n'a mentionné cette propriété.


Notez que dans Win RT, la propriété est juste TabIndex="0".


11
L'astuce consiste à utiliser TabIndex avec différentes valeurs de KeyboardNavigation.TabNavigation dans l'élément parent. Je me retrouve le plus souvent à utiliser TabNavigation "Local". :)
Greg D

J'ai dû l'ajouter à chacun de mes contrôles, au lieu de simplement les ajouter aux différents StackPanels qui hébergent lesdits contrôles.
DJ van Wyk

Je trouve que le réglage <DockPanel Panel.ZIndex="2">aide à commander le point d'entrée des panneaux de niveau supérieur.
avenmore

25

<Control KeyboardNavigation.TabIndex="0" ... /> Fonctionne parfaitement bien ... Par exemple-

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

Vous permettra de naviguer dans ces deux zones de liste déroulante à l'aide de la touche TAB.


13

Je pense qu'il existe une solution beaucoup plus simple ici, en haut de votre contrôle ou de votre fenêtre ou autre, vous pouvez ajouter:

KeyboardNavigation.TabNavigation="Cycle"

Cela ignore également automatiquement les onglets réduits.


6

Une autre alternative qui a fonctionné pour moi dans le passé est de simplement supprimer tous les TabIndex instructions et de laisser les contrôles utiliser l'ordre dans lequel ils sont déclarés en XAML travailler leur magie.

Ceci, bien sûr, peut vous obliger à réorganiser vos commandes. Mais il s'agit d'une simple opération de copier-coller.


5
Le problème est que vous ne pouvez pas simplement réorganiser les contrôles dans des éléments tels que DockPanels où l'ordre dans lequel vous les ajoutez ne correspond pas à l'ordre de tabulation. Par exemple, pensez aux boutons d'ancrage sur la droite. Vous ancrez le dernier en premier, l'avant-dernière seconde, etc. mais vous voulez que l'ordre de tabulation soit inversé. C'est ce qui me tracasse le plus. Des moments comme celui-ci me manquent les vieux jours VB6 (pas la langue, juste cette fonctionnalité) où vous choisissez «Définir l'ordre des onglets» et cliquez simplement sur tous vos contrôles. Simple et doux. Frustrant, nous n'avons rien de tel ici en 2018.
Mark A. Donohoe

1
@Mark ou 2020 :). L'ordre des onglets dans WPF est incroyablement compliqué, chaque fois que j'ai besoin d'un ordre personnalisé, je dois passer toute la journée à lutter contre son imprévisibilité. Dans Winforms, c'était une tâche banale qui prend quelques minutes par fenêtre.
bokibeg

0

Vous pouvez utiliser KeyboardNavigation.TabNavigation = "None" pour ignorer complètement la tabulation pour un contrôle spécifique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.