停止键盘方向导航从一个用户控件跳出到另一个用户控件

时间:2016-02-09 09:00:51

标签: wpf xaml

我创建了非常简单的布局来显示我的问题。基本上我在另一个usercontrol(浏览)中有一个usercontrol(form),现在我希望能够使用tab和ctrl + tab循环遍历表单。但是我注意到当我按下任何一个按钮(在表单内)上的箭头键时,它跳出表单到浏览。因此,我将键盘的方向导航设置为无,但它忽略了它,仍然允许我使用箭头键导航。如何确保我无法使用键盘退出该表单?

这是xaml

<Window xmlns:wpfApplication1="clr-namespace:WpfApplication1">
<Grid>
<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
    <RowDefinition />
</Grid.RowDefinitions>
<TextBlock HorizontalAlignment="Center" FontSize="36" Text="This is a browse" />
<wpfApplication1:Form Grid.Row="1"/>
<StackPanel Grid.Row="2"
            HorizontalAlignment="Center"
            Orientation="Horizontal">
    <Button Height="50" Width="300">move previous</Button>
    <Button Height="50" Width="300">move next</Button>
</StackPanel>
</Grid>
</Window>

<UserControl x:Class="WpfApplication1.Form"
     Margin="30"
     Background="Gray"
     KeyboardNavigation.ControlTabNavigation="Cycle"
     KeyboardNavigation.DirectionalNavigation="None"
     KeyboardNavigation.TabNavigation="Cycle">
<Grid>
<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
</Grid.RowDefinitions>
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
    <TextBlock VerticalAlignment="Center" Text="First Name:" />
    <TextBox Width="500"
             Height="50"
             HorizontalAlignment="Left" />
</StackPanel>
<StackPanel Grid.Row="1"
            Grid.ColumnSpan="2"
            HorizontalAlignment="Center"
            Orientation="Horizontal">
    <Button Width="200"
            Height="50"
            Content="Save" />
    <Button Width="200"
            Height="50"
            Content="Close" />
</StackPanel>
</Grid>

谢谢:)

2 个答案:

答案 0 :(得分:2)

您可以为按钮添加PreviewKeyDown的处理程序,以覆盖箭头键事件。

<Button PreviewKeyDown="Button_PreviewKeyDown" />

代码:

private void Button_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.IsDown && e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Left || e.Key == Key.Right)
    {
        e.Handled = true;
    }
}

修改

如果您希望使用样式为所有按钮添加处理程序,可以使用EventSetter来执行此操作:

<UserControl.Resources>
    <Style TargetType="{x:Type Button}">
        <EventSetter Event="PreviewKeyDown" Handler="Button_PreviewKeyDown"/>
    </Style>
</UserControl.Resources>

答案 1 :(得分:2)

来自MSDN

KeyboardNavigationMode值:

  

- 此容器内不允许使用键盘导航。

这意味着不允许从此容器外部使用键导航到此容器中。

您正在寻找的是:

  

包含 - 根据导航的方向,当到达容器的结尾或开头时,焦点将返回到第一个或最后一个项目,但不会超过容器的开头或结尾