如何防止选项卡导航到控件,同时允许方向导航到该控件

时间:2014-12-05 22:09:16

标签: wpf focus tabbing keyboard-navigation

在WPF(MVVM,没有代码隐藏)中,说我有以下xaml:

<StackPanel>
    <Button>Normal 1</Button>
    <Button>Special</Button> <!--This button should not tab focus, but still focus via arrow keys-->
    <Button>Normal 2</Button>
</StackPanel>

默认情况下,您可以(1)按钮之间的标签或(2)按钮之间的上/下箭头。我想制作一个按钮 - 特殊按钮 - 可通过标签对焦,但仍可通过向上/向下对焦。我尝试了IsTabStop="False",但这也阻止了通过方向导航(向上/向下箭头)对该按钮进行聚焦。

如何从标签导航中删除单个按钮,而继续允许定向导航?对于所有其他控件,Tab键和箭头应不受影响。

我尝试过IsTabStopKeyboardNavigation.TabNavigationKeyboardNavigation.DirectionalNavigation的组合无济于事。也许我还没找到合适的搭配。或许还有另一种方法。想法?


编辑:好的,我正在加入赏金。为了清楚起见,我正在寻找一个MVVM,没有代码隐藏的方式来装饰一个控件(例如通过样式,附加属性,附加行为等),这样就可以从Tab键顺序中删除它,同时保持有效的方向导航目标。对窗口(或类似)中的控件的硬编码知识是不可接受的。这需要是一个通用的,可重用的解决方案。类似于:<Button AllowDirectionalNavigationButPreventTabNavigation="True"/>

2 个答案:

答案 0 :(得分:9)

那个选项怎么样?您将特殊按钮粘贴到另一个容器中并放入KeyboardNavigation.TabNavigation =&#34;无&#34;在那个容器上。我刚试过它,看起来我能达到你的需要。

<StackPanel >
  <Button>Normal 1</Button>
  <StackPanel KeyboardNavigation.TabNavigation="None">
    <Button>Special</Button><!--This button should not tab focus, but still focus via arrow keys-->
  </StackPanel>
  <Button>Normal 2</Button>
</StackPanel>

答案 1 :(得分:0)

在这里我是怎么做到的:

<Window x:Class="MvvmLight1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ignore="http://www.ignore.com"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:command="http://www.galasoft.ch/mvvmlight"
    mc:Ignorable="d ignore"
    Height="300"
    Width="300"
    DataContext="{Binding Main, Source={StaticResource Locator}}">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="KeyDown">
        <command:EventToCommand Command="{Binding Mode=OneWay,Path=KeyDownCommand}" PassEventArgsToCommand="True"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
<Grid x:Name="LayoutRoot">
    <StackPanel>
        <Button>Normal 1</Button>
        <Button>Special</Button>
        <!--Should not tab focus, yet still focus via arrow keys-->
        <Button>Normal 2</Button>
    </StackPanel>
</Grid>

我正在使用mvvmlight,而EventToCommand用于拦截KeyDown事件并将其指向ViewModel中的以下命令:

 private RelayCommand<KeyEventArgs> _keyDownCommand;
    public RelayCommand<KeyEventArgs> KeyDownCommand
    {
        get
        {
            return _keyDownCommand
                ?? (_keyDownCommand = new RelayCommand<KeyEventArgs>(
                (s) =>
                {
                    if (s.Key == Key.Tab)
                    {
                        s.Handled = true;
                    }
                }));
        }
    }