我有一个承载控件的ListBox。我希望能够从一个控件到下一行的控件。在我点击标签后,似乎隐式生成的ListBoxItem正在获得焦点。我怎么能绕过这个?
<ListBox ItemsSource="{Binding UiControls}"
DockPanel.Dock="Top"
BorderThickness="0"
Background="{DynamicResource ControlInteriorBrush}"
KeyboardNavigation.TabNavigation="Continue"
KeyboardNavigation.ControlTabNavigation="Continue">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="col1"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="col2"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="col3"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBlock Text="{Binding Path=Label}"
FontWeight="Bold"
VerticalAlignment="Center"
Background="{DynamicResource ControlInteriorBrush}"
Foreground="{DynamicResource FontBrush}"
Margin="0,0,25,0"
KeyboardNavigation.TabNavigation="Continue"/>
</Border>
<Controls:AutoCompleteTextBox Default="{Binding Path=DefaultValue}"
Items="{Binding Path=DropDownValues}"
Tag="{Binding}"
DataContext="{Binding}"
Width="300"
Grid.Column="1"
Height="30"
Background="{DynamicResource ControlInteriorBrush}"
Margin="0,0,10,0"
KeyboardNavigation.IsTabStop="True"
FocusManager.IsFocusScope="True"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 0 :(得分:4)
以下是一种模式,您可以使用该模式允许列表框项目中的各个控件参与选项卡导航。我只包含了所需的XAML - 您必须根据自己的需要进行自定义。
<ListBox Focusable="False" KeyboardNavigation.TabNavigation="Continue">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Focusable" Value="False"/>
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="IsSelected" Value="true" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
当勾选到此列表框时,第一个项目中的第一个可聚焦控件将获得焦点。再次跳转将移动到第一个项目中的下一个可聚焦控件,当没有更多控件时,焦点(和选择)将移动到列表框中的下一个项目。当达到最后一个项目中的最后一个控件时,tabbing将移动到包含元素中列表框后面的下一个控件。
由于ListBoxItem
无法获得焦点,因此您无法使用箭头键在列表中的项目之间导航。您必须在ListBoxItem
内的每个控件中实现此功能。
答案 1 :(得分:2)
使用不带焦点的ItemsControl而不是使用ListBox。
<ItemsControl ItemsSource="{Binding UiControls}" >
...
</ItemsControl>