2010-11-18 28 views
8

我在窗口中的所有控件上设置了IsTabStop为false,所以当我按下Tab键时,焦点不会移动(我需要Tab键作为别的东西)。但这样做会打破箭头键导航 - 我点击ListView中的某个项目,然后按向上/向下不会再改变所选项目。WPF:如何在不禁用箭头键导航的情况下禁用标签导航?

有没有办法禁用标签导航,但没有触摸箭头键导航?他们似乎有关系。

我试着将IsTabStop设置为true,TabNavigation设为false,但它也不起作用。

<ListView ItemContainerStyle="{StaticResource ItemCommon}" IsTabStop="False"> 
    <ListView.Resources> 
     <Style x:Key="ItemCommon"> 
      <Setter Property="IsTabStop" Value="False"/> 
      <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/> 
      <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle"/> 
     </Style> 
    </ListView.Resources> 
</ListView> 

回答

14

在您的窗口(或您不希望标签工作的控件的某个祖先)上,使用Tab键。

您可以通过附加到PreviewKeyDown事件来吞咽它,并在键是选项卡时设置e.Handled = true。

纯代码背后:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      this.PreviewKeyDown += MainWindowPreviewKeyDown; 
     } 

     static void MainWindowPreviewKeyDown(object sender, KeyEventArgs e) 
     { 
      if(e.Key == Key.Tab) 
      { 
       e.Handled = true; 
      } 
     } 
    } 

您也可以设置键盘处理程序,例如:

<Window x:Class="TabSwallowTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Keyboard.PreviewKeyDown="Window_PreviewKeyDown" > 

    <StackPanel> 
     <TextBox Width="200" Margin="10"></TextBox> 
     <TextBox Width="200" Margin="10"></TextBox> 
    </StackPanel> 
</Window> 

,但你需要一个相应的事件处理程序:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 

    { 
     if (e.Key == Key.Tab) 
     { 
      e.Handled = true; 
     } 
    } 
+0

不错。我几乎是这样做的,但是正在处理PreviewKeyUp而不是PreviewKeyDown,所以尽管我设置了e.Handled = true,但那时已经太晚了,焦点在某处出现了。 – Jon 2015-04-23 16:31:59

+0

这也可以防止在该Tabber内通过控件进行切换。 – bytecode77 2016-07-29 12:17:54

5

我相信你想要的是设置KeyboardNavigation.TabNavigation附加属性到一旦在您的ListView上。我已经用模板化的ItemsControl完成了它,它似乎给了我期望的行为,如ListBox,其中控件的选项卡将选择第一项,但附加选项卡将从列表框中选中并移到下一个控件。

因此,遵循这种方法,你的例子可能会缩短到这一点。

<ListView ItemContainerStyle="{StaticResource ItemCommon}" 
      KeyboardNavigation.TabNavigation="Once" /> 

我还没有用ListView控件测试过,但是如果它适合你,我不会感到惊讶。