2010-11-18 29 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控件測試過,但是如果它適合你,我不會感到驚訝。