DockPanel Tab顺序

Nic*_*win 16 wpf user-interface dockpanel tabindex ui-design

我在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>
Run Code Online (Sandbox Code Playgroud)

我希望文本框填充组合框和按钮之间的所有剩余空间.我不得不把文本框放在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]
Run Code Online (Sandbox Code Playgroud)

在目前的情况下,它会发生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问题有任何想法?

Edw*_*ard 32

如果要保留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>
Run Code Online (Sandbox Code Playgroud)

正如您所发现的,如果您只是设置控件的选项卡索引值,则这些值对于表单是全局的,因此所有TabIndex ="0"都先选中,然后选中TabIndex ="1",依此类推.在父容器上设置KeyboardNavigation.TabNavigation ="Local"修复它.

  • 我喜欢这个选项,因为在某些情况下我对DockPanel布局非常强烈,并且尽量避免在任何地方使用网格,除非它们因某些其他原因而有意义. (5认同)

Gob*_*lin 8

您可以使用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>
Run Code Online (Sandbox Code Playgroud)

如果您希望它们在不同的列中很好地对齐 - 您可以使用SharedSizeGroup.