2010-11-18 8 views
8

J'ai mis IsTabStop à false sur tous les contrôles dans ma fenêtre, de sorte que lorsque j'appuie sur la touche Tab, le focus ne bouge pas (j'ai besoin de la touche Tab pour autre chose). Mais ce faisant, il coupe la navigation par touches fléchées - je clique sur un élément dans un ListView et l'appui sur les touches haut/bas ne modifie plus l'élément sélectionné.WPF: Comment désactiver la navigation par onglets sans désactiver la navigation par touches fléchées?

Y at-il un moyen de désactiver la navigation par onglets, mais sans toucher la navigation par touches fléchées? Ils semblent être liés.

J'ai essayé de définir IsTabStop à true et TabNavigation à false, mais cela ne fonctionne pas non plus.

<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> 

Répondre

14

Sur votre fenêtre (ou un ancêtre des contrôles sur lequel vous ne voulez pas que l'onglet fonctionne), avalez la touche de tabulation.

Vous pouvez l'avaler en vous attachant à l'événement PreviewKeyDown et définir e.Handled = true lorsque la clé est un onglet.

pur code Derrière:

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; 
      } 
     } 
    } 

Vous pouvez également définir un gestionnaire de clavier en tant que tel:

<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> 

mais vous aurez besoin d'un gestionnaire d'événements correspondant:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 

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

Nice. Je le faisais presque, mais je gérais PreviewKeyUp et non PreviewKeyDown donc bien que je définissais e.Handled = true, il était trop tard et la mise au point s'est arrêtée quelque part. – Jon

+0

Cela empêche également la tabulation à travers les contrôles dans ce Tabber. – bytecode77

5

I croire ce que vous voulez est de définir le KeyboardNavigation.TabNavigation propriété jointe à Une fois sur votre ListView. Je l'ai fait avec un ItemsControl basé sur des modèles et il semble me donner le comportement que je m'attendais à un ListBox où un onglet dans le contrôle sélectionnera le premier élément, mais un onglet supplémentaire sera tabulé hors de la liste et sur le contrôle suivant. Donc, en suivant cette méthode, votre exemple pourrait être en court-circuit.

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

Je n'ai pas testé cela avec le contrôle ListView mais je ne serais pas surpris si cela fonctionne pour vous.

Questions connexes