WPF: Comment désactiver onglet de navigation sans désactiver aussi la touche de navigation fléchée?

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

  •  25-09-2019
  •  | 
  •  

Question

J'ai mis IsTabStop à faux sur tous les contrôles dans ma fenêtre, de sorte que lorsque j'appuie sur la touche Tab, le focus ne se déplace pas (j'ai besoin de la touche Tab pour autre chose). Mais, ce faisant des pauses flèche touche de navigation - je clique sur un élément dans un ListView puis en appuyant sur le haut / vers le bas ne change pas le plus l'élément sélectionné

.

Yat-il un moyen de désactiver onglet de navigation, mais sans toucher à la navigation flèche? Ils semblent être liés.

J'ai essayé la mise IsTabStop à true et false TabNavigation, mais il ne fonctionne pas non plus.

<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>
Était-ce utile?

La solution

Sur la fenêtre (ou un ancêtre des contrôles que vous ne voulez pas l'onglet de travailler sur) avalent la touche de tabulation.

Vous pouvez l'avaler en attachant à l'événement PreviewKeyDown et définissez e.Handled = true lorsque la clé est un onglet.

Code de pur Derrière:

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

Vous pouvez également définir un gestionnaire de clavier en tant que tel:

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

mais vous aurez besoin d'un gestionnaire d'événements correspondant:

   private void Window_PreviewKeyDown(object sender, KeyEventArgs e)

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

Autres conseils

Je crois que ce que vous voulez est de définir le KeyboardNavigation.TabNavigation propriété attachée à Une fois sur votre ListView. Je l'ai fait avec un templated ItemsControl et il semble me donner le comportement que j'attendre comme un ListBox où un onglet dans le contrôle sélectionnera le premier élément, mais un onglet onglet supplémentaire de volonté à droite de la zone de liste et sur la contrôle suivant.

suivant cette méthode votre exemple peut être en mesure d'être à un peu raccourci dans ce.

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

Je n'ai pas testé avec le contrôle cependant ListView mais je ne serais pas surpris si cela fonctionne pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top