在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键和箭头应不受影响。
我尝试过IsTabStop
,KeyboardNavigation.TabNavigation
和KeyboardNavigation.DirectionalNavigation
的组合无济于事。也许我还没找到合适的搭配。或许还有另一种方法。想法?
编辑:好的,我正在加入赏金。为了清楚起见,我正在寻找一个MVVM,没有代码隐藏的方式来装饰一个控件(例如通过样式,附加属性,附加行为等),这样就可以从Tab键顺序中删除它,同时保持有效的方向导航目标。对窗口(或类似)中的控件的硬编码知识是不可接受的。这需要是一个通用的,可重用的解决方案。类似于:<Button AllowDirectionalNavigationButPreventTabNavigation="True"/>
。
答案 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;
}
}));
}
}