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>

コンボボックスとボタンの間の残りのスペースをすべてテキストボックスで埋めたいです。DockPanelは最後の子のみを埋めるため、テキストボックスをXAMLの最後に配置する必要がありました。見栄えがします。ただし、タブの順序はめちゃくちゃになっています。これで、combobox-combobox-textbox-buttonの代わりにcombobox-combobox-button-textboxがタブになります。

各アイテムのプロパティを使用してみKeyboardNavigation.TabIndexましたが、これはItemsControlのDataTemplateであるため(これらのドックパネルはそれぞれ個別のアイテム用になります)、タブの順序が各アイテムのコンボボックスを垂直方向にジャンプし、次に各テキストボックスを垂直方向にジャンプします。 、次に各行を横切ってから下に移動するという望ましい動作ではなく、各ボタンを垂直に下に移動します。

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の問題を解決する方法について誰かが何かアイデアを持っていますか?

4

3 に答える 3

36

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"を設定すると、修正されます。

于 2011-01-26T19:08:50.897 に答える
8

次のように、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 に答える