【问题标题】:WPF DataGrid navigation: ArrowUp key focusses on TextBoxWPF DataGrid 导航:ArrowUp 键专注于 TextBox
【发布时间】:2017-09-02 21:09:40
【问题描述】:

我或多或少对 DataGrid 的行为感到惊讶。我的应用程序有几个 TexBoxes 用于输入,组合在一个网格中,在该网格之外我有一个 DataGrid 来显示内容。 DataGrid 样式如下:

<Style x:Key="SignalsTable" TargetType="{x:Type DataGrid}">
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="AutoGenerateColumns" Value="False"/>
    <Setter Property="SelectionUnit" Value="FullRow"/>
    <Setter Property="SelectionMode" Value="Extended"/>
    <Setter Property="CanUserAddRows" Value="False"/>
    <Setter Property="CanUserDeleteRows" Value="False"/>
    <Setter Property="CanUserReorderColumns" Value="False"/>
    <Setter Property="CanUserResizeColumns" Value="False"/>
    <Setter Property="CanUserResizeRows" Value="False"/>
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
    <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
</Style>

DataGrid 的部分 XAML:

<DataGrid x:Name="MT_Raster_SignalsTable" 
          ItemsSource="{Binding Source={StaticResource SignalsCollectionViewSource}}" 
          Margin="20,240,20,20" 
          Style="{StaticResource SignalsTable}"
          KeyboardNavigation.DirectionalNavigation="None"
          PreviewKeyUp="SignalTableKeyUp">
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        </Style>
    </DataGrid.CellStyle>
    <DataGrid.Columns>

剩下的是列定义。

我只是无法使用箭头键进行“正常”导航(KeyboardNavigation.DirectionalNavigation="Continue" 有时会在 ArrowUp/Down 时导致表格大幅跳转),所以我设置了 'KeyboardNavigation.DirectionalNavigation="None "' 并在 SignalTableKeyUp() 中附加了一个键盘处理程序来自己做事。这适用于 Home(到表格顶部)和 End(到表格底部),但 ArrowUp/Down 仍然有奇怪的行为:

  1. ArrowUp 导致 DataGrid 焦点丢失,焦点转到窗口中的某个 TexBox。
  2. 如果我在一行上单击两次然后点击 ArrowUp,SignalTableKeyUp() 处理程序将被调用一次,DataGrid 的 SelectedIndex 在该处理程序中减少 1,但 DataGrid 中的选定行减少 2!当我再次点击 ArrowUp 时,TextBox 获得焦点......
  3. 如果我点击一行两次然后点击 ArrowDown,SignalTableKeyUp() 处理程序会被调用一次,DataGrid 的 SelectedIndex 在该处理程序中会增加 1,但 DataGrid 中的选定行会增加 2!当我再次点击 ArrowDown 时,所选行增加一(如预期的那样)。

有人知道这里发生了什么,或者有解决方案吗?

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    好的,我尝试了一些方法,解决方案显然非常简单......现在我自己处理预览键,进行我想要的选择更改,然后将事件设置为“已处理”,这样就不会执行其他操作按键:

    private void SignalTableKeyDown(object sender, KeyEventArgs e)
    {
        // Do selection stuff in DataGrid.
    
        // Prevent any other actions.
    
        e.Handled = true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多