2010-11-18 42 views
8

He configurado IsTabStop como falso en todos los controles de mi ventana, de modo que cuando presiono la tecla Tab, el foco no se mueve (necesito la tecla Tab para otra cosa). Pero al hacerlo, se rompe la navegación con la tecla de flecha: hago clic en un elemento en un ListView y luego al presionar arriba/abajo ya no cambia el elemento seleccionado.WPF: ¿Cómo desactivar la navegación de pestañas sin deshabilitar la navegación con la tecla de flecha?

¿Hay alguna manera de desactivar la navegación de pestañas, pero sin tocar la navegación con la tecla de flecha? Parecen estar relacionados.

Intenté configurar IsTabStop en true y TabNavigation en falso, pero tampoco funciona.

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

Respuesta

14

En la ventana (o algún antepasado de los controles que no desea pestaña para trabajar en) trague la tecla de tabulación.

Puede tragar adjuntando al evento PreviewKeyDown y establecer e.Handled = true cuando la tecla es una pestaña.

Código puro Detrás:

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

También puede configurar un controlador de teclado como tal:

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

pero se necesita un controlador de eventos correspondiente:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 

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

Agradable. Casi estaba haciendo esto, pero manejaba PreviewKeyUp no PreviewKeyDown así que, aunque estaba configurando e.Handled = true, era demasiado tarde en ese momento y el foco se disparó en algún lugar. – Jon

+0

Esto también evita tabular a través de controles dentro de ese Tabber también. – bytecode77

5

I cree que lo que quiere es configurar el KeyboardNavigation.TabNavigation propiedad adjunta a Once en su ListView. He hecho esto con un ItemsControl con plantilla y parece que me da el comportamiento que esperaría, como un ListBox, donde una pestaña en el control seleccionará el primer elemento, pero una pestaña adicional saldrá de la lista en la lista y en el siguiente control

Por lo tanto, siguiendo este método, su ejemplo puede ser más corto que esto.

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

No he probado esto con el control ListView sin embargo, no me sorprendería si funciona para usted.

Cuestiones relacionadas