2010-08-23 13 views
13

मैं एक DockPanel नीचे के रूप में एक ItemsControl की DataTemplate में सेट अप हैं। मुझे एक्सएएमएल में आखिरी बार टेक्स्टबॉक्स डालना पड़ा क्योंकि डॉकपैनल केवल अंतिम बच्चे को भर देगा। ये बहुत अच्छा दिखता है; हालांकि, टैब ऑर्डर अब खराब हो गया है। यह अब combobox-combobox-textbox-बटन के बजाय combsox-combobox-button-textbox टैब करता है।DockPanel टैब आदेश

मैंने प्रत्येक आइटम पर KeyboardNavigation.TabIndex गुणों का उपयोग करने का प्रयास किया, लेकिन चूंकि यह आइटम्स कंट्रोल के लिए डेटा टेम्पलेट है (इनमें से प्रत्येक डॉकपैनल्स एक अलग आइटम के लिए होंगे), जिसने टैब ऑर्डर को प्रत्येक आइटम के कंबोबॉक्स के नीचे लंबवत रूप से कूद दिया है, फिर प्रत्येक टेक्स्टबॉक्स को लंबवत रूप से नीचे, प्रत्येक पंक्ति में लंबवत रूप से प्रत्येक पंक्ति में जाने के वांछित व्यवहार के बजाय, प्रत्येक बटन को नीचे दबाएं।

उदाहरण यूआई:

[Combo11] [Combo12] [Text1] [Button1] 
[Combo21] [Combo22] [Text2] [Button2] 

मामलों की वर्तमान स्थिति में, यह Combo11,Combo12,Button1,Text1,Combo21,Combo22,Button2,Text2 चला जाता है। अगर मैं TabOrder गुण जोड़ता हूं, तो यह Combo11,Combo21,Combo12,Combo22,Text1,Text2,Button1,Button2 जाता है।

मुझे यह Combo11,Combo12,Text1,Button1,Combo21,Combo22,Text2,Button2 जाना है।

क्या किसी के पास इस UI समस्या को हल करने के बारे में कोई विचार है?

उत्तर

6

तुम इतनी तरह DockPanel के बजाय एक ग्रिड इस्तेमाल कर सकते हैं,:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <ComboBox /> 
    <ComboBox Grid.Column="1"/> 
    <TextBox Grid.Column="2" MinWidth="100" /> 
    <Button Grid.Column="3">Button</Button> 
</Grid> 

और आप उन्हें विभिन्न स्तंभों में अच्छी तरह से संरेखित करने के लिए चाहते हैं - आप SharedSizeGroup इस्तेमाल कर सकते हैं।

+0

यह वास्तव में अच्छा काम करता है ... और मुझे पूछना है, पहले combobox के पास कोई कॉलम नंबर क्यों नहीं है? क्या इसका मतलब यह स्वचालित रूप से कॉलम # 0 को सौंपा गया है? और साझा आकार समूह समूह के लिए एक गुच्छा धन्यवाद - मुझे नहीं पता था कि खोजना भी है! (पी। आप भूल गए/में) – NickAldwin

+0

इसमें एक ग्रिड.कॉलम = "0" हो सकता है - लेकिन 0 डिफ़ॉल्ट मान है - और मैं आलसी हूं :-)। हाँ, साझा आकार समूह एक छुपे हुए मणि की तरह है। मैंने दूसरों के लिए अपना उदाहरण अपडेट किया। – Goblin

+0

बह, साझा आकार समूह को ठीक से काम करने के लिए नहीं मिला - शायद तीसरे कॉलम में स्टार आकार के कारण। :( – NickAldwin

-5

क्या आपने टैब ऑर्डर को स्पष्ट रूप से सेट करने का प्रयास किया है?

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

"मैंने प्रत्येक आइटम पर कीबोर्ड नाविगेशन.TabIndex गुणों का उपयोग करने का प्रयास किया, लेकिन चूंकि यह आइटम्स कंट्रोल के लिए डेटा टेम्पलेट है (इनमें से प्रत्येक डॉकपैनल्स एक अलग आइटम के लिए होंगे), जिसने टैब ऑर्डर को प्रत्येक आइटम के नीचे लंबवत रूप से कूद दिया है। comboboxes, फिर प्रत्येक टेक्स्टबॉक्स को लंबवत रूप से नीचे, प्रत्येक पंक्ति में लंबवत रूप से प्रत्येक पंक्ति में जाने के वांछित व्यवहार के बजाय, प्रत्येक बटन को नीचे दबाएं। " – NickAldwin

+0

वाह, गंभीरता से इसके लिए एक वोट वोट? – Robaticus

+4

कोई नुकसान नहीं हुआ, लेकिन मैं उन उत्तरों को कम करने की कोशिश करता हूं जो वास्तव में कुछ भी समझाने में मदद नहीं करते हैं ... इस उदाहरण में, मैंने पहले ही अपने प्रश्न में टैब ऑर्डर करने का उल्लेख किया था। दोबारा, मुझे पता है क्योंकि आप मुझसे बात नहीं सुन सकते हैं, आप इसे एक स्नैकी टिप्पणी के रूप में गलत तरीके से समझ सकते हैं, लेकिन मैं वास्तव में स्टैक ओवरव्लो को एक सहायक और अव्यवस्थित जगह रखने की कोशिश कर रहा हूं। – NickAldwin

24

यदि आप डॉकपैनल को बनाए रखना चाहते हैं, तो आप कीबोर्ड डॉकपैन पर कीबोर्डNavigation.TabNavigation = "Local" का उपयोग कर सकते हैं, और फिर आप इसके अंतर्गत नियंत्रणों पर टैब इंडेक्स मान सेट कर सकते हैं।

इस तरह -

<ItemsControl HorizontalContentAlignment="Stretch"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <DockPanel KeyboardNavigation.TabNavigation="Local"> 
        <ComboBox DockPanel.Dock="Left" TabIndex="1"/> 
        <ComboBox DockPanel.Dock="Left" TabIndex="2"/> 
        <Button DockPanel.Dock="Right" TabIndex="4">Button</Button> 
        <!-- This will appear before the button...it has to go after it in the XAML so it will fill properly in the DockPanel --> 
        <TextBox DockPanel.Dock="Left" MinWidth="100" HorizontalAlignment="Stretch" TabIndex="3"/> 
       </DockPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

आप पाया के रूप में, अगर आप सिर्फ नियंत्रण के टैब सूचकांक मूल्यों को निर्धारित, इन फार्म के लिए वैश्विक हैं, इसलिए सभी tabindex = "0" पहले में टैब किए गए हैं, फिर सभी TabIndex = "1", और इसी तरह। कीबोर्ड कंटेनर सेट करें। टैबनेविगेशन = पैरेंट कंटेनर पर "लोकल" इसे ठीक करता है।

+3

मुझे यह विकल्प पसंद है क्योंकि मैं कुछ मामलों में डॉकपैनल लेआउट के बारे में बहुत दृढ़ता से महसूस करता हूं, और हर जगह ग्रिड का उपयोग करने से बचने के लिए लंबाई तक चला गया, जब तक कि वे किसी अन्य कारण से समझ में नहीं आते। – TheZenker