การตั้งค่าลำดับแท็บใน WPF


92

ฉันจะตั้งค่าลำดับแท็บใน WPF ได้อย่างไร ฉันมี ItemsControl ที่มีบางรายการขยายและบางรายการยุบและต้องการข้ามรายการที่ยุบเมื่อฉันกำลังแท็บ

ความคิดใด ๆ ?


คำตอบที่เจสซีเสนอคือหนทางที่จะไป ...
Román

ที่ดูเหมือนจะเป็นพฤติกรรมเริ่มต้น?
JonnyRaa

@ Románเจสซี่คือใคร?
ชิงทรัพย์รับบี

1
@ Stealth Rabbi: คำตอบที่เลือก ชื่ออาจเปลี่ยนไป (จาก 11 ปีที่แล้ว😆)
Román

คำตอบ:


63

คุณสามารถข้ามองค์ประกอบในลำดับแท็บได้โดยตั้งค่าKeyboardNavigation.IsTabStopบนองค์ประกอบใน XAML

KeyboardNavigation.IsTabStop="False"

คุณสามารถตั้งค่าทริกเกอร์ที่จะสลับคุณสมบัตินี้ตามสถานะที่ขยายได้


1
นอกจากนี้คุณยังสามารถ Focusable = "False" ซึ่งจะลบออกจาก Keyboard focus รวมทั้งลำดับแท็บ
Geoff Cox

2
@Geoff ฉันทำสิ่งนี้ด้วยปุ่มหลายปุ่มและมันไม่ได้ผลแค่ fyi
ToastyMallows

สิ่งนี้ช่วยให้สามารถข้ามการควบคุมที่คุณไม่ต้องการเป็นส่วนหนึ่งของการสั่งซื้อแท็บได้ แต่มีปัญหาอื่น ๆ อีกมากมายใน WPF การจัดลำดับแท็บไม่ใช่ลำดับชั้นดังนั้นหากมีการควบคุมอื่น ๆ บนหน้าจอที่มีการจัดลำดับเป็นศูนย์ (ซึ่งทำตามค่าเริ่มต้น) การจัดลำดับแท็บจะไม่ทำงาน
Christian Findlay

90

หากคุณต้องการตั้งค่าการจัดลำดับแท็บอย่างชัดเจนสำหรับองค์ประกอบในรูปแบบของคุณคุณสมบัติที่แนบต่อไปนี้ควรจะช่วยได้:

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

ฉันบอกว่า "ควรจะช่วย" เนื่องจากยังไม่พบว่ามีความน่าเชื่อถือมากนักแม้ว่าฉันจะต้องอ่านเพิ่มเติมเกี่ยวกับวิธีการใช้งาน ฉันโพสต์คำตอบนี้เพียงครึ่งเดียวเพราะไม่มีใครพูดถึงคุณสมบัตินี้


โปรดสังเกตว่าใน Win RT TabIndex="0"คุณสมบัติเป็นเพียง


11
เคล็ดลับคือการใช้ TabIndex กับค่าต่างๆของ KeyboardNavigation.TabNavigation ในองค์ประกอบหลัก ฉันพบว่าตัวเองใช้ TabNavigation "Local" บ่อยที่สุด :)
Greg D

ฉันต้องเพิ่มสิ่งนี้ในการควบคุมแต่ละรายการแทนที่จะเพิ่มลงใน StackPanels อื่นที่โฮสต์กล่าวว่าการควบคุม
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"

นอกจากนี้ยังเป็นการอัตโนมัติโดยไม่สนใจแท็บที่ยุบ


6

อีกทางเลือกหนึ่งที่ได้ผลสำหรับฉันในอดีตคือการลบเนื้อหาที่ชัดเจนทั้งหมดออก TabIndexและปล่อยให้การควบคุมใช้คำสั่งที่ประกาศไว้ใน XAML เพื่อใช้เวทมนตร์

แน่นอนว่าอาจทำให้คุณต้องจัดลำดับการควบคุมของคุณใหม่ แต่นี่เป็นการดำเนินการคัดลอกวางอย่างง่าย


5
ปัญหาคือคุณไม่สามารถจัดลำดับการควบคุมใหม่ในสิ่งต่างๆเช่น DockPanels ได้โดยที่ลำดับที่คุณเพิ่มไม่ตรงกับลำดับแท็บ ตัวอย่างเช่นพิจารณาปุ่มเชื่อมต่อทางด้านขวา คุณเชื่อมต่ออันสุดท้ายก่อนวินาทีถึงวินาทีสุดท้าย ฯลฯ แต่คุณต้องการให้ลำดับแท็บกลับด้าน นั่นคือสิ่งที่ทำให้ฉันเดินทางได้มากที่สุด เวลาเช่นนี้ฉันคิดถึง VB6 วันเก่า ๆ (ไม่ใช่ภาษา แต่เป็นเพียงคุณลักษณะนี้) ที่คุณเลือก "ตั้งค่าลำดับแท็บ" และคลิกผ่านการควบคุมทั้งหมดของคุณ เรียบง่ายและอ่อนหวาน น่าผิดหวังที่เราไม่มีอะไรแบบนั้นในปี 2018
Mark A. Donohoe

1
@ มาร์คหรือ 2020 :) การสั่งซื้อแท็บใน WPF นั้นซับซ้อนมากเมื่อใดก็ตามที่ฉันต้องการการสั่งซื้อแบบกำหนดเองฉันต้องใช้เวลาทั้งวันในการต่อสู้กับความไม่สามารถคาดเดาได้ ใน Winforms เป็นงานทางโลกที่ใช้เวลาไม่กี่นาทีต่อหน้าต่าง
bokibeg

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.