【问题标题】:Keyboard navigation in WPF GridsWPF 网格中的键盘导航
【发布时间】:2012-10-29 22:18:30
【问题描述】:

假设您有一个 StackPanel,其中包含一个 ScrollViewer,该 ScrollViewer 包含另一个带有 ItemsControl 和绑定 ItemsSource 的 StackPanel。此 ItemsSource 绑定到在运行时创建的 Grid 集合。每个 Grid 包含一个标签和一个文本框/组合框/几个复选框,它们在 StackPanel 中都有一个唯一的 TabIndex 值。 这是 xaml:

<ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
  <StackPanel Name="stackPanel" MinWidth="500" Width="Auto">
    <ItemsControl Name="itemsControl"                          ItemsSource="{Binding ElementName=SomeWindow, Path=GridsCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
  </StackPanel>
</ScrollViewer>

我想简单地从一个控件切换到下一个控件,但仅限于网格集合中网格的控件内。到目前为止,我已经尝试了不同的 KeyboardNavigation.TabNavigation 设置,但没有任何运气。最好的方法是什么?

【问题讨论】:

  • 请您发布一些 XAML / 代码来说明场景以及您想要实现的确切目标吗?

标签: wpf keyboard navigation grid itemscontrol


【解决方案1】:

TabNavigation 设置为KeyboardNavigationMode.Cycle 为每个您希望这样操作的容器,这样只要您使用TabShift,焦点就不会逃脱它>+制表符

KeyboardNavigation.SetTabNavigation(grid1, KeyboardNavigationMode.Cycle);

如果你想改变 Ctrl+Tab 的行为,使用KeyboardNavigation.SetControlTabNavigation

【讨论】:

  • 谢谢。但是,这会导致焦点放置在一个(给定)网格内的不同控件中。我实际上有一组网格,因此焦点需要从一个网格转移到下一个网格,或者从网格内的一个控件转移到同一网格内的下一个控件。我尝试将 KeyboardNavigation 设置为 StackPanel 和 StackPanel 的 ItemControl,但没有任何运气。
  • 正如对本文中另一个答案的反应所述,问题在于动态创建的网格中控件的可见性。我稍后再谈。谢谢你的回答。
【解决方案2】:

您可以应用一个隐式样式来禁用每个控件的选项卡,然后重新启用它以实现您想要的选项卡:

<ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
  <ScrollViewer.Resources>
      <Style TargetType="Control">
          <Setter Property="IsTabStop" Value="False" />
      </Style>
  </ScrollViewer.Resources>
  <StackPanel Name="stackPanel" MinWidth="500" Width="Auto">
    <ItemsControl Name="itemsControl"                          
                  ItemsSource="{Binding ElementName=SomeWindow, Path=GridsCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
  </StackPanel>
</ScrollViewer>

不要忘记将动态生成的网格上的 IsTabStop 设置为 True

【讨论】:

  • System.Windows.Controls.Grid 在 .Net 4.0 中似乎没有 IsTabStop 属性,但除此之外,感谢您的回答。我已经尝试过了,发现为什么这两个答案都不起作用:动态创建的网格中的控件在运行时将 IsVisible 设置为 false,尽管我仍然可以看到它们并在代码中明确设置可见性。另一个挑战... :)
猜你喜欢
  • 2015-08-22
  • 2011-09-05
  • 1970-01-01
  • 2011-04-25
  • 2011-01-17
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多