2012-03-27 52 views
1

我有我一直在试图解决一个问题 - 以下内容:KeyboardNavigation.ControlTabNavigation应用程序范围广?

KeyboardNavigation.ControlTabNavigation="None" 

似乎并不在我的应用程序,尽管我尽了最大努力工作,任何地方...我不完全知道为什么,但不管我做什么,CTRL + TAB功能总是有效,在我的情况下,这种行为对我希望我的标签控件如何操作是不利的。理想情况下,我不想在整个应用程序中禁用ControlTabNavigation,而不是将我的应用程序中的每个容器都放置上述标记(我无法继续工作)。有没有办法做到这一点,而不必去容器容器,并有任何明显的“陷阱”,通常保持上述工作不正常?

谢谢! Aj

+0

我在某种程度上遇到了同样的情况。我能够在TabControl上使用KeyboardNavigation.ControlTabNavigation =“None”,但是,**直到** I鼠标选择(即,左键单击)Tab。在那个时候,我可以再次在选项卡上按Ctrl-Tab,这与我寻求(和期望)发生的情况相反。你在这个问题的其他地方得到了任何反馈,或者你自己取得了进展吗?谢谢。 – Bill 2012-04-23 18:10:15

+0

一厢情愿的想法...如果你发现一个解决方案,但请发布它。 – Aaj 2012-04-23 18:29:28

回答

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还会让我的用户不再以这种方式切换并更改标签......以防万一任何人遇到此问题是。

希望它有帮助!

1

我发现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