我发现KeyboardNavigation无法正常工作,因为它属于Ctrl-Tab和TabControl。我把一个简单的原型和KeyboardNavigation.ControlTabNavigation="None"
放在一起似乎没有预期的影响,使用Ctrl-Tab切换标签,一旦我左键单击一个标签并且键盘焦点在TabControl内。
但是,使用InputBindings和Command可以覆盖不需要的Ctrl-Tab默认行为。从那里,我发现KeyboardNavigation.TabNavigation="Cycle"
以及TabNavigation的其他选项似乎表现合理。使用下面资源链接中介绍的FocusManager和其他技术应该允许获得所需的键盘导航,尽管使用了一些反直觉技术。
对于具有不需要的默认行为的每个控件,必须设置InputBindings,但是更复杂的解决方案可能会使可视树遍历某个类型的所有控件的InputBindings。我发现让命令完全不会中和关键序列。在我的例子中,我显示一个测试对话框。
请注意,下面的命令绑定要求您定位WPF 4.0;请参阅资源在后的资源上如何定位WPF 3.5的结束或更早
在XAML:
<TabControl
x:Name="tabControl1"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SelectedTabItem}"
ItemsSource="{Binding TabItemViewModels}"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Continue">
<TabControl.InputBindings>
<KeyBinding Modifiers="Control"
Key="Tab"
Command="{Binding ShowDialogCommand}" />
</TabControl.InputBindings>
</TabControl>
注意,在上面的XAML,KeyboardNavigation.ControlTabNavigation="None"
是没有效果,可以消除。
在背衬的DataContext,典型地一个ViewModel:
声明你的结合特性:
public RelayCommand ShowDialogCommand
{
get;
private set;
}
初始化属性;例如,可以在视图模型的构造(注意,RelayCommand是从MVVM-光库。):
ShowDialogCommand = new RelayCommand(() =>
{
MessageBox.Show("Show dialog box command executed", "Show Dialog Box Command", MessageBoxButton.OK, MessageBoxImage.Information);
});
资源:
Helpful StackOverflow post on KeyBindings
More detail on KeyBinding to a Command; describes special CommandReference technique needed if targeting WPF framewrok 3.5 or earlier
Microsoft's Focus Overview
我在某种程度上遇到了同样的情况。我能够在TabControl上使用KeyboardNavigation.ControlTabNavigation =“None”,但是,**直到** I鼠标选择(即,左键单击)Tab。在那个时候,我可以再次在选项卡上按Ctrl-Tab,这与我寻求(和期望)发生的情况相反。你在这个问题的其他地方得到了任何反馈,或者你自己取得了进展吗?谢谢。 – Bill 2012-04-23 18:10:15
一厢情愿的想法...如果你发现一个解决方案,但请发布它。 – Aaj 2012-04-23 18:29:28