У меня есть DockPanel, настроенный в DataTemplate ItemsControl, как показано ниже:
<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
для каждого элемента, но так как это DataTemplate для ItemsControl ( каждая из этих док-панелей будет предназначена для отдельного элемента), в результате чего порядок вкладок перемещался вертикально вниз по каждому из списков элементов, затем вертикально вниз к каждому текстовому полю, а затем вертикально вниз к каждой кнопке, а не к желаемому поведению перехода по каждой строке, затем вниз.
Пример пользовательского интерфейса:
[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
.
У кого-нибудь есть идеи, как решить эту проблему с пользовательским интерфейсом?
Вы можете использовать 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.
Вы пробовали явно установить порядок табуляции?
<Control KeyboardNavigation.TabIndex="0" />