【发布时间】: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 仍然有奇怪的行为:
- ArrowUp 导致 DataGrid 焦点丢失,焦点转到窗口中的某个 TexBox。
- 如果我在一行上单击两次然后点击 ArrowUp,SignalTableKeyUp() 处理程序将被调用一次,DataGrid 的 SelectedIndex 在该处理程序中减少 1,但 DataGrid 中的选定行减少 2!当我再次点击 ArrowUp 时,TextBox 获得焦点......
- 如果我点击一行两次然后点击 ArrowDown,SignalTableKeyUp() 处理程序会被调用一次,DataGrid 的 SelectedIndex 在该处理程序中会增加 1,但 DataGrid 中的选定行会增加 2!当我再次点击 ArrowDown 时,所选行增加一(如预期的那样)。
有人知道这里发生了什么,或者有解决方案吗?
【问题讨论】: