KeyboardNavigation.ControlTabNavigation Application Wide?

时间:2012-03-27 14:06:08

标签: wpf xaml keyboard-shortcuts tabcontrol

我有一个问题,我一直在尝试处理 - 以下内容:

KeyboardNavigation.ControlTabNavigation="None"
尽管我付出了最大的努力,

似乎在我的应用程序中没有任何工作......我不完全确定为什么但是无论我做什么,CTRL + TAB功能始终有效,在我的情况下,行为是有害的如何我喜欢我的标签控件来操作。理想情况下,我不想将上面的标记放在我的应用程序中的每个容器中(我无论如何都无法工作),我想在整个应用程序中禁用ControlTabNavigation。有没有办法做到这一点,而不必逐个容器,并有任何明显的“陷阱”,通常会使上述工作不正常吗?

谢谢! AJ

2 个答案:

答案 0 :(得分:1)

我发现KeyboardNavigation不能像我预期的那样工作,因为它与Ctrl-Tab和TabControl有关。我把一个简单的原型和KeyboardNavigation.ControlTabNavigation="None"组合在一起似乎没有对使用Ctrl-Tab切换选项卡产生预期的影响,一旦我左键单击一个选项卡并且键盘焦点位于TabControl中。

但是,将InputBindings与Command一起使用可以覆盖不需要的Ctrl-Tab默认行为。从那里,我发现KeyboardNavigation.TabNavigation="Cycle"以及TabNavigation的其他选项似乎表现得相当合理。使用FocusManager和下面的资源链接中描述的其他技术应该允许人们获得所需的键盘导航,尽管使用了一些反直觉的技术。

必须为每个具有不需要的默认行为的控件设置InputBinding,例如,更复杂的解决方案可能会使可视树为特定类型的所有控件设置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;
}

初始化该属性;例如,可以在ViewModel的构造函数中(注意,RelayCommand来自MVVM-Light库。):

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

答案 1 :(得分:0)

我有一段时间没有看过这个问题,但是因为比尔问它引起了新的兴趣。而不是通过控制来控制,我使用了Bill建议的空命令,但将其应用于TabControl模板......正如Bill指出的那样,有点反直觉的解决方案,但是它有效(我还考虑了Ctrl + Shift) + Tab,它与Ctrl + Tab的方向相反):

MyClass的:

public static readonly RoutedCommand CancelTabChangeCommand = new RoutedCommand() { };

XAML:

<Style TargetType="{x:Type TabControl}">    
  <Setter Property="Template">
     <Setter.Value>
        <ControlTemplate TargetType="{x:Type TabControl}">
           <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                    <Grid.InputBindings>
                        <KeyBinding Command="{x:Static local:myClass.CancelTabChangeCommand}" Key="Tab" Modifiers="Control" />
                        <KeyBinding Command="{x:Static star:Startup.CancelTabChangeCommand}" Key="Tab" Modifiers="Shift+Control"/>
                    </Grid.InputBindings>

我离开了我班上的其余部分和XAML,因为它与示例无关,但如果有人需要,我很乐意提供更多。在一个相关的说明中,我还发现为TabItem创建一个控件模板并将IsTabStop属性设置为false也可以防止我的用户以这种方式切换和更改选项卡...以防任何人遇到此问题,因为我是

希望它有所帮助!