WPF:Come disabilitare la navigazione tramite schede senza disabilitare anche la navigazione con i tasti freccia?

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

  •  25-09-2019
  •  | 
  •  

Domanda

Ho impostato IsTabStop su false su tutti i controlli nella mia finestra, in modo che quando premo il tasto Tab, lo stato attivo non si sposta (ho bisogno del tasto Tab per qualcos'altro).Ma in questo modo si interrompe la navigazione con i tasti freccia: faccio clic su un elemento in a ListView quindi premendo su/giù l'elemento selezionato non viene più modificato.

Esiste un modo per disabilitare la navigazione tramite schede, ma senza toccare la navigazione con i tasti freccia?Sembrano essere imparentati.

Ho provato a impostare IsTabStop a vero e TabNavigation a false, ma non funziona neanche questo.

<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>
È stato utile?

Soluzione

Sulla tua finestra (o su qualche antenato dei controlli su cui non vuoi che funzioni la scheda) ingoia il tasto Tab.

Puoi inghiottirlo allegandolo all'evento PreviewKeyDown e impostando e.Handled = true quando la chiave è una scheda.

Codice puro dietro:

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

Puoi anche impostare un gestore tastiera come tale:

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

ma avrai bisogno di un gestore eventi corrispondente:

   private void Window_PreviewKeyDown(object sender, KeyEventArgs e)

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

Altri suggerimenti

Credo che quello che vuoi sia impostare il file KeyboardNavigation.TabNavigation proprietà annessa a Una volta sul tuo ListView.L'ho fatto con un ItemsControl basato su modello e sembra darmi il comportamento che mi aspetterei da un ListBox in cui una scheda nel controllo selezionerà il primo elemento ma una scheda aggiuntiva verrà inserita direttamente fuori dalla casella di riepilogo e sul controllo successivo.

Quindi, seguendo questo metodo, il tuo esempio potrebbe essere abbreviato proprio in questo.

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

Tuttavia non l'ho testato con il controllo ListView, ma non sarei sorpreso se funzionasse per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top