WPF: Como desativar a navegação da guia sem também desativar a navegação de chave de seta?

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

  •  25-09-2019
  •  | 
  •  

Pergunta

Eu arrumei IsTabStop Para false em todos os controles na minha janela, para que, quando pressione a tecla TAB, o foco não se move (preciso da tecla TAB para outra coisa). Mas fazer isso quebra a navegação de teclas de seta - clico em um item em um ListView E depois pressionar a subida/para baixo não altera o item selecionado.

Existe uma maneira de desativar a navegação da guia, mas sem tocar na navegação de teclas de seta? Eles parecem estar relacionados.

Eu tentei configurar IsTabStop para verdadeiro e TabNavigation Para falso, mas também não 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>
Foi útil?

Solução

Na sua janela (ou algum ancestral dos controles em que você não deseja que funcione) engula a tecla de guia.

Você pode engolir, anexando o evento VisuewKeyDown e definido e.handled = true quando a tecla é uma guia.

Código puro por trá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;
            }
        }
    }

Você também pode definir um manipulador 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>

Mas você precisará de um manipulador de eventos correspondente:

   private void Window_PreviewKeyDown(object sender, KeyEventArgs e)

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

Outras dicas

Eu acredito que o que você quer é definir o Keyboardnavigation.tabnavigation propriedade anexada para Uma vez no seu ListView. Eu fiz isso com um itemsControl de item modificado e parece me dar o comportamento que eu esperaria de como uma caixa de listagem em que uma guia no controle selecionará o primeiro item, mas uma guia adicional guia logo após a caixa de listagem e para o Próximo controle.

Portanto, seguindo esse método, seu exemplo poderá ser mais curto com isso.

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

No entanto, não testei isso com o controle da ListView, mas não ficaria surpreso se funcionasse para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top