Mengatur urutan tab di WPF

92

Bagaimana cara mengatur pemesanan tab di WPF? Saya memiliki ItemsControl dengan beberapa item diperluas dan beberapa runtuh dan ingin melewatkan item yang diciutkan saat saya melakukan tab.

Ada ide?

Roma
sumber
Jawaban diusulkan Jesse adalah cara untuk pergi ...
Román
yang tampaknya merupakan perilaku default?
JonnyRaa
@ Román siapa Jesse?
Stealth Rabbi
1
@Stealth Rabbi: jawaban yang dipilih. Nama mungkin telah berubah (dari 11 tahun yang lalu 😆)
Román

Jawaban:

63

Anda dapat melewati elemen dalam urutan tab dengan menyetel KeyboardNavigation.IsTabStop pada elemen di XAML.

KeyboardNavigation.IsTabStop="False"

Anda dapat menyiapkan pemicu yang akan mengalihkan properti ini berdasarkan status yang diperluas.

Tusukan
sumber
1
Anda juga bisa Focusable = "False" yang menghapusnya dari fokus Keyboard serta urutan tab.
Geoff Cox
2
@Geoff Saya melakukan ini dengan banyak tombol dan tidak berhasil, hanya fyi.
ToastyMallows
Ini memungkinkan untuk melewatkan kontrol yang Anda tidak ingin menjadi bagian dari pemesanan tab, tetapi ada banyak masalah lain di WPF. Urutan tab tidak hierarkis jadi, jika ada kontrol lain di layar yang memiliki urutan nol (yang mereka lakukan secara default) maka pengurutan tab tidak akan berfungsi.
Christian Findlay
90

Jika Anda ingin secara eksplisit mengatur urutan tab untuk elemen dalam formulir Anda, properti terlampir berikut seharusnya membantu:

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

Saya mengatakan "seharusnya membantu" karena saya belum menganggapnya sangat dapat diandalkan meskipun saya mungkin perlu membaca lebih lanjut tentang bagaimana hal itu dimaksudkan untuk digunakan. Saya hanya memposting jawaban setengah matang ini karena tidak ada orang lain yang menyebutkan properti ini.


Perhatikan bahwa di Win RT, propertinya hanya TabIndex="0".

Drew Noakes
sumber
11
Caranya adalah dengan menggunakan TabIndex dengan berbagai nilai KeyboardNavigation.TabNavigation di elemen induknya. Saya menemukan diri saya menggunakan TabNavigation "Lokal" paling sering. :)
Greg D
Saya harus menambahkan ini ke setiap kontrol saya, alih-alih hanya menambahkannya ke StackPanels berbeda yang menghosting kontrol tersebut.
DJ van Wyk
Saya menemukan pengaturan <DockPanel Panel.ZIndex="2">membantu untuk memesan titik masuk panel tingkat atas.
lebih dari
25

<Control KeyboardNavigation.TabIndex="0" ... /> Bekerja dengan baik ... Misalnya-

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

Akan memungkinkan Anda untuk menavigasi melalui dua kotak kombo ini menggunakan tombol TAB.

Pankaj
sumber
13

Saya pikir ada solusi yang jauh lebih mudah di sini, di bagian atas dalam kendali atau jendela Anda atau apa pun, Anda dapat menambahkan:

KeyboardNavigation.TabNavigation="Cycle"

Ini juga secara otomatis mengabaikan tab yang diciutkan.

AltF4_
sumber
6

Alternatif lain yang berhasil bagi saya di masa lalu adalah dengan hanya menghapus semua TabIndexpernyataan eksplisit , dan membiarkan kontrol menggunakan urutan yang dideklarasikan di XAML bekerja dengan ajaib.

Ini, tentu saja, mungkin mengharuskan Anda untuk menyusun ulang kendali Anda. Tapi ini adalah operasi salin-tempel sederhana.

Gustavo Mori
sumber
5
Masalahnya adalah Anda tidak bisa begitu saja menyusun ulang kontrol dalam hal-hal seperti DockPanels di mana urutan yang Anda tambahkan tidak sesuai dengan urutan tab. Misalnya, pertimbangkan tombol dok di sebelah kanan. Anda menggalangkan yang terakhir terlebih dahulu, detik ke detik terakhir, dll. Tetapi Anda ingin urutan tab dibalik. Itulah yang paling membuatku tersandung. Saat-saat seperti ini saya merindukan VB6 hari yang lama (bukan bahasa, hanya fitur ini) di mana Anda memilih 'Set tab order' dan cukup klik melalui semua kontrol Anda. Sederhana dan manis. Frustasi kami tidak memiliki hal seperti itu di sini pada tahun 2018.
Mark A. Donohoe
1
@ Atau 2020 :). Pemesanan tab di WPF sangat rumit, setiap kali saya membutuhkan pemesanan khusus, saya harus menghabiskan sepanjang hari bergulat dengan ketidakpastiannya. Di Winforms, itu adalah tugas biasa yang membutuhkan beberapa menit per jendela.
bokibeg
0

Anda dapat menggunakan KeyboardNavigation.TabNavigation = "Tidak Ada" untuk melewati Tabbing sepenuhnya untuk kontrol tertentu.

pengguna2306815
sumber