DockPanel Tab顺序

时间:2010-08-23 16:39:38

标签: wpf user-interface tabindex ui-design dockpanel

我在ItemsControl的DataTemplate中设置了DockPanel,如下所示:

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

我希望文本框能够填充组合框和按钮之间的所有剩余空间。我不得不把文本框放在XAML的最后,因为DockPanel只会填充最后一个孩子。看起来不错;但是,标签顺序现在搞砸了。它现在选中了combobox-combobox-button-textbox而不是combobox-combobox-textbox-button。

我尝试在每个项目上使用KeyboardNavigation.TabIndex属性,但由于这是ItemsControl的DataTemplate(每个dockpanels将用于单独的项目),这使得Tab键顺序垂直向下跳转到每个项目'组合框,然后垂直向下放置每个文本框,然后垂直向下按下每个按钮,而不是跨越每一行的所需行为,然后向下。

示例UI:

[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问题有任何想法?

3 个答案:

答案 0 :(得分:31)

如果要保留DockPanel,可以在父Dockpanel上使用KeyboardNavigation.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”,等等上。在父容器上设置KeyboardNavigation.TabNavigation =“Local”修复它。

答案 1 :(得分:6)

您可以使用Grid而不是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。

答案 2 :(得分:-5)

您是否尝试过明确设置标签顺序?

<Control KeyboardNavigation.TabIndex="0" />