代码之家  ›  专栏  ›  技术社区  ›  Meh

WPF:如何在不禁用箭头键导航的情况下禁用选项卡导航?

  •  8
  • Meh  · 技术社区  · 15 年前

    我已经准备好了 IsTabStop 对窗口中的所有控件设置为false,这样当我按Tab键时,焦点不会移动(我需要Tab键来执行其他操作)。但这样做会中断箭头键导航-我单击 ListView 然后按向上/向下键不会再更改所选项目。

    有没有一种方法可以禁用选项卡导航,但不触碰箭头键导航?他们似乎有亲戚关系。

    我试着设置 伊斯塔斯托普 真实的和 TabNavigation 错了,但也不管用。

    <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>
    
    2 回复  |  直到 15 年前
        1
  •  15
  •   Ed Gonzalez    15 年前

    在您的窗口(或某些不希望tab操作的控件的祖先)上,吞下tab键。

    您可以通过附加到PreviewKeyDown事件来接受它,并在键是制表符时设置e.Handled=true。

    纯代码:

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

    您还可以设置键盘处理程序,如下所示:

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

    但您需要相应的事件处理程序:

       private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    
        {
            if (e.Key == Key.Tab)
            {
                e.Handled = true;
            }
        }
    
        2
  •  5
  •   jpierson    15 年前

    我相信你想要的是 键盘导航.TabNavigation 附加属性到 一次 在你的列表视图上。我已经用一个模板化的ItemsControl完成了这项工作,它似乎给了我一种我所期望的行为,就像一个列表框,其中一个进入控件的选项卡将选择第一个项,而另一个选项卡将直接从列表框进入下一个控件。

    因此,遵循这种方法,您的示例可能会简而言之就是这样。

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

    不过,我还没有用ListView控件测试过它,但如果它对您有用的话,我不会感到惊讶。