WPF: How to disable tab navigation without also disabling arrow key navigation?

后端 未结 2 1787
清酒与你
清酒与你 2021-01-12 01:52

I have set IsTabStop to false on all controls in my window, so that when I press the Tab key, the focus doesn\'t move (I need the Tab key for something else). B

相关标签:
2条回答
  • 2021-01-12 02:34

    On your window (or some ancestor of the controls you don't want tab to work on) swallow the tab key.

    You can swallow it by attaching to the PreviewKeyDown event and set e.Handled = true when the key is a tab.

    Pure Code Behind:

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

    You can also set a Keyboard handler as such:

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

    but you'll need a corresponding event handler:

       private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    
        {
            if (e.Key == Key.Tab)
            {
                e.Handled = true;
            }
        }
    
    0 讨论(0)
  • 2021-01-12 02:44

    I believe what you want is to set the KeyboardNavigation.TabNavigation attached property to Once on your ListView. I've done this with a templated ItemsControl and it seems to give me the behavior that I would expect from like a ListBox where a tab into the control will select the first item but an additional tab will tab right out of the listbox and onto the next control.

    So following this method your example may be able to be shortend down to just this.

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

    I haven't tested this with the ListView control however but I wouldn't be surprised if it works for you.

    0 讨论(0)
提交回复
热议问题