2010-08-23 11 views
13

Ich habe ein DockPanel in der Datatemplate eines Items aufgebaut wie folgt:DockPanel Tab-Reihenfolge

<ItemsControl HorizontalContentAlignment="Stretch"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <DockPanel> 
     <ComboBox DockPanel.Dock="Left"/> 
     <ComboBox DockPanel.Dock="Left"/> 
     <Button DockPanel.Dock="Right">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"/> 
     </DockPanel> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ich die Textbox wollen alle den verbleibenden Platz zwischen den Comboboxen und die Schaltfläche füllen. Ich musste das Textfeld zuletzt im XAML platzieren, da DockPanel nur das letzte Kind füllt. Das sieht großartig aus; Allerdings ist die Tab-Reihenfolge jetzt vermasselt. Es gibt jetzt tabs combobox-combobox-button-textbox statt combobox-combobox-textbox-button.

Ich habe versucht, KeyboardNavigation.TabIndex Eigenschaften für jeden Artikel zu verwenden, aber da dies eine DataTemplate für ein ItemsControl ist (jeder dieser Dockpanels wird für einen separaten Artikel sein), die Tabulatorreihenfolge vertikal nach unten jeder Combobox der Artikel springen, dann vertikal nach unten in jedem Textfeld, dann vertikal nach unten auf jeden Knopf, anstatt das gewünschte Verhalten über jede Reihe zu gehen, dann nach unten.

Beispiel UI:

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

Im aktuellen Stand der Dinge, es geht Combo11,Combo12,Button1,Text1,Combo21,Combo22,Button2,Text2. Wenn ich TabOrder Eigenschaften hinzufüge, geht es Combo11,Combo21,Combo12,Combo22,Text1,Text2,Button1,Button2.

Ich möchte es gehen Combo11,Combo12,Text1,Button1,Combo21,Combo22,Text2,Button2.

Hat jemand irgendwelche Ideen, wie man dieses UI-Problem lösen kann?

Antwort

6

könnten Sie ein Gitter anstelle des DockPanel, etwa so:

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

Und wenn Sie wollen, dass sie in den verschiedenen Spalten schön ausrichten - Sie SharedSizeGroup nutzen könnten.

+0

Das hat wirklich gut funktioniert ... und ich muss fragen, warum hat die erste Combobox keine Spaltennummer? Bedeutet das, dass es Spalte 0 automatisch zugewiesen wird? Und vielen Dank für den SharedSizeGroup-Tipp - ich hätte keine Ahnung, was ich überhaupt suchen soll! (Sie haben vergessen/in) – NickAldwin

+0

Es könnte eine Grid.Column = "0" haben - aber 0 ist der Standardwert - und ich bin faul :-). Ja, SharedSizeGroup ist eine Art verstecktes Juwel. Ich habe mein Beispiel für andere aktualisiert. – Goblin

+0

Bah, konnte die SharedSizeGroup nicht ordnungsgemäß funktionieren - wahrscheinlich wegen der Sterngröße in der dritten Spalte. :( – NickAldwin

-5

Haben Sie versucht, die Tab-Reihenfolge explizit festzulegen?

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

"Ich habe versucht, die KeyboardNavigation.TabIndex-Eigenschaften für jedes Element zu verwenden, aber da dies ein DataTemplate für ein ItemsControl ist (jedes dieser Dockpanels wird für ein separates Element sein), hat die Tab-Reihenfolge jeden der Elemente vertikal nach unten springen lassen." Comboboxen, dann vertikal nach unten jedes Textfeld, dann vertikal nach unten auf jede Taste, anstatt das gewünschte Verhalten über jede Zeile gehen, dann nach unten. " – NickAldwin

+0

Wow, ernsthaft eine Stimme dafür abstimmen? – Robaticus

+4

Kein Schaden gemeint, aber ich tendiere dazu, Antworten zu verwerfen, die nicht wirklich helfen, etwas zu erklären ... In diesem Beispiel hatte ich bereits erwähnt, die Tab-Reihenfolge in meiner Frage zu testen. Wiederum, ich weiß, da du mich nicht hören kannst, könntest du das als einen merkwürdigen Kommentar missverstehen, aber ich versuche nur, StackOverflow einen hilfreichen und übersichtlichen Platz zu halten. – NickAldwin

24

Wenn Sie das DockPanel beibehalten möchten, können Sie KeyboardNavigation.TabNavigation = "Local" auf dem übergeordneten Dockpanel verwenden, und dann können Sie die Registerindexwerte für die Steuerelemente darin festlegen.

Like this -

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

Wie Sie, wenn Sie die Registerkarte Indexwerte der Kontrollen nur eingestellt, sind diese auf die Form global, so dass alle die TabIndex = "0" in erster Tabbed, dann alle TabIndex = "1", und so weiter. Set KeyboardNavigation.TabNavigation = "Local" auf dem übergeordneten Container behebt es.

+3

Ich mag diese Option, wie ich fühle mich ziemlich stark über das Layout DockPanel in einigen Fällen, und ging zu Längen, um die Verwendung von Rastern überall zu vermeiden, es sei denn, sie aus einem anderen Grund sinnvoll. – TheZenker