WPF: Como desativar a navegação da guia sem também desativar a navegação de chave de seta?
-
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>
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ê.