WPF: Cómo desactivar la navegación pestaña sin también deshabilitar flecha de navegación clave?

StackOverflow https://stackoverflow.com/questions/4210659

  •  25-09-2019
  •  | 
  •  

Pregunta

he puesto IsTabStop en false en todos los controles en mi ventana, de modo que cuando se presiona la tecla Tab, el foco no se mueve (necesito la tecla Tab para otra cosa). Pero haciendo pausas esta flecha tecla de navegación - hago clic en un elemento en un ListView y presionando hacia arriba / abajo no cambia el elemento seleccionado más

.

¿Hay una manera de desactivar la navegación pestaña, pero sin tocar la tecla de navegación flecha? Ellos parecen estar relacionados.

He intentado establecer IsTabStop a verdadera y falsa a TabNavigation, pero no funciona bien.

<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>
¿Fue útil?

Solución

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

Se puede tragar uniendo al evento y PreviewKeyDown conjunto e.Handled = true cuando la llave es una ficha.

Pure código subyacente:

 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 tales como:

<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 necesitará un controlador de eventos correspondiente:

   private void Window_PreviewKeyDown(object sender, KeyEventArgs e)

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

Otros consejos

Creo que lo que quiere es establecer el KeyboardNavigation.TabNavigation propiedad adjunta a Una vez en el ListView. He hecho esto con un ItemsControl con plantilla y parece que me diera el comportamiento que yo esperaría de como un cuadro de lista en una ficha en el control seleccionará el primer elemento, pero una pestaña adicional voluntad pestaña derecha del cuadro de lista y en la siguiente control.

Así que siguiendo este método tu ejemplo puede ser capaz de ser shortend hasta justo esto.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top