18

我在 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 只会填充最后一个子元素。看起来不错; 但是,标签顺序现在搞砸了。它现在选项卡组合框组合框按钮文本框而不是组合框组合框文本框按钮。

我尝试KeyboardNavigation.TabIndex在每个项目上使用属性,但由于这是 ItemsControl 的 DataTemplate(每个停靠面板都将用于一个单独的项目),这使得选项卡顺序垂直向下跳到每个项目的组合框,然后垂直向下跳到每个文本框,然后垂直向下每个按钮,而不是遍历每一行,然后向下的期望行为。

示例用户界面:

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

4

3 回答 3

36

如果要保留 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",依此类推。Set KeyboardNavigation.TabNavigation="Local" 在父容器上修复它。

于 2011-01-26T19:08:50.897 回答
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>

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

于 2010-08-23T18:02:36.727 回答
-5

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

<Control KeyboardNavigation.TabIndex="0" />
于 2010-08-23T16:46:08.137 回答