2010-11-18 10 views
8

Ich habe IsTabStop auf alle Steuerelemente in meinem Fenster auf false festgelegt, so dass wenn ich die Tab-Taste drücke, der Fokus nicht bewegt (ich brauche die Tab-Taste für etwas anderes). Aber das bricht die Pfeiltasten Navigation - ich klicke auf ein Element in einem ListView und dann drücken nach oben/unten ändert das ausgewählte Element nicht mehr.WPF: Wie kann die Tab-Navigation deaktiviert werden, ohne dass die Navigation durch die Pfeiltasten deaktiviert wird?

Gibt es eine Möglichkeit, die Tab-Navigation zu deaktivieren, aber ohne die Pfeiltasten Navigation zu berühren? Sie scheinen verwandt zu sein.

Ich habe versucht, IsTabStop zu True und TabNavigation zu false, aber es funktioniert auch nicht.

Antwort

14

In Ihrem Fenster (oder einem Vorfahren der Steuerelemente, die nicht funktionieren sollen) schlucken Sie die Tabulatortaste.

Sie können es durch Anhängen an das PreviewKeyDown-Ereignis schlucken und e.Handled = true festlegen, wenn der Schlüssel ein Tab ist.

pur-Code Behind:

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

Sie auch ein Keyboard Handler als solche festlegen:

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

aber Sie werden einen entsprechenden Event-Handler benötigen:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 

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

Schön. Ich machte das fast schon, aber ich ging mit PreviewKeyUp und nicht mit PreviewKeyDown um, obwohl ich e.Handled = true einstellte, war es zu spät, und der Fokus verschwand irgendwo. – Jon

+0

Dies verhindert auch das Tabbing über die Steuerelemente innerhalb dieses Tabbers. – bytecode77

5

I glauben, was Sie wollen, ist die KeyboardNavigation.TabNavigation beigefügt Eigenschaft zu Einmal auf Ihrem ListView. Ich habe dies mit einem templated ItemsControl getan und es scheint mir das Verhalten zu geben, das ich von einer ListBox erwarten würde, wo eine Registerkarte in das Steuerelement das erste Element auswählen wird, aber eine zusätzliche Registerkarte wird direkt aus der Listbox und auf die Registerkarte nächste Kontrolle.

Nach dieser Methode kann Ihr Beispiel in der Lage sein, auf genau dies verkürzt werden.

Ich habe dies nicht mit dem ListView-Steuerelement getestet, aber ich wäre nicht überrascht, wenn es für Sie funktioniert.

Verwandte Themen