Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 停止键盘方向导航从一个用户控件跳出另一个用户控件_Wpf_Xaml - Fatal编程技术网

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

Wpf 停止键盘方向导航从一个用户控件跳出另一个用户控件,wpf,xaml,Wpf,Xaml,我已经创建了非常简单的布局来显示我的问题。基本上,我有一个usercontrol(表单)在另一个usercontrol(browse)的内部,现在我希望能够使用tab和ctrl+tab在表单中循环,它就是这样做的。但我注意到,当我按下任何按钮(在表单中)上的箭头键时,它会跳出表单进入浏览。因此,我将键盘的方向导航设置为“无”,但它忽略了方向导航,仍然允许我使用箭头键进行导航。我如何确保我不能用键盘摆脱那种状态 这是xaml <Window xmlns:wpfApplication1="cl

我已经创建了非常简单的布局来显示我的问题。基本上,我有一个usercontrol(表单)在另一个usercontrol(browse)的内部,现在我希望能够使用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>

上移
下一步


谢谢:)

您可以添加按钮的
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>