我在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问题有任何想法?
答案 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" />