Wpf 停止键盘方向导航从一个用户控件跳出另一个用户控件
我已经创建了非常简单的布局来显示我的问题。基本上,我有一个usercontrol(表单)在另一个usercontrol(browse)的内部,现在我希望能够使用tab和ctrl+tab在表单中循环,它就是这样做的。但我注意到,当我按下任何按钮(在表单中)上的箭头键时,它会跳出表单进入浏览。因此,我将键盘的方向导航设置为“无”,但它忽略了方向导航,仍然允许我使用箭头键进行导航。我如何确保我不能用键盘摆脱那种状态 这是xamlWpf 停止键盘方向导航从一个用户控件跳出另一个用户控件,wpf,xaml,Wpf,Xaml,我已经创建了非常简单的布局来显示我的问题。基本上,我有一个usercontrol(表单)在另一个usercontrol(browse)的内部,现在我希望能够使用tab和ctrl+tab在表单中循环,它就是这样做的。但我注意到,当我按下任何按钮(在表单中)上的箭头键时,它会跳出表单进入浏览。因此,我将键盘的方向导航设置为“无”,但它忽略了方向导航,仍然允许我使用箭头键进行导航。我如何确保我不能用键盘摆脱那种状态 这是xaml <Window xmlns:wpfApplication1="cl
<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>
上移
下一步
谢谢:)您可以添加按钮的
PreviewKeyDown
处理程序来覆盖箭头键事件
<Button PreviewKeyDown="Button_PreviewKeyDown" />
编辑:
如果希望使用样式为所有按钮添加处理程序,可以使用EventSetter:
<UserControl.Resources>
<Style TargetType="{x:Type Button}">
<EventSetter Event="PreviewKeyDown" Handler="Button_PreviewKeyDown"/>
</Style>
</UserControl.Resources>
来自
键盘导航模式
值:
无-此容器内不允许键盘导航
这意味着不允许使用密钥从容器外部导航到此容器
您需要的是:
包含-根据导航的方向,当到达容器的末尾或开头时,焦点会返回到第一个或最后一个项目,但不会移动到容器的开头或结尾
谢谢您的回答,那么是否仍然可以完全停止使用箭头键导航?您可以在窗口级别停止它,并在根窗口上设置
KeyboardNavigation.DirectionalNavigation=“Once”
。但你不应该搞砸了,定向导航是用户交互的一个有用部分。非常感谢,它正是我所需要的。我不需要在按钮之间导航,也不需要使用箭头键关闭表单进行浏览。因此,如果用户想退出表单,则tab将在表单上循环,然后tab以保存或取消并按它。幸运的是,我仍然可以通过DirectionalNavigation设置为Once-through listbox(刚刚测试过)来导航。但有一件事我不明白,为什么它必须设置为一次,我试图将它设置为“无”,但它不起作用。它没有意义,但它在窗口级别按需要工作一次,然后影响所有形式:)谢谢你的回答,没有更好的解决方案吗?因为我有很多地方,我必须做这样的事情。我想会有一个xaml解决方案,我可以将它转换成一个样式,这样它就可以应用到所有地方。你可以为所有按钮(或任何其他控件)添加相同的事件,就像你必须应用相同的样式一样,所以没有太大的区别。如果希望保留MVVM,您可以添加附加属性,但这只是更多的代码,但您可以看看这个问题:谢谢。我同意上面的答案,你的也行。但是另一个允许我将它设置在一个地方(也可以是一个xaml行),并且我不必在任何地方引用它:)
<UserControl.Resources>
<Style TargetType="{x:Type Button}">
<EventSetter Event="PreviewKeyDown" Handler="Button_PreviewKeyDown"/>
</Style>
</UserControl.Resources>