WPF DataGrid导航:ArrowUp键专注于TextBox

时间:2017-09-02 21:09:40

标签: c# wpf datagrid

我或多或少被DataGrid行为所震惊。我的应用程序有一些用于输入的TexBox,在Grid中组合,在Grid之外我有一个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 =“无“'并附上一个键盘处理程序来自己在SignalTableKeyUp()中做事。这适用于Home(到表的顶部)和End(到表的底部),但是ArrowUp / Down仍然有奇怪的行为:

  1. ArrowUp导致DataGrid焦点丢失,焦点转移到窗口某处的某个TexBox。
  2. 如果我点击一行两次然后点击ArrowUp,则会调用一次SignalTableKeyUp()处理程序,DataGrid的SelectedIndex会在该处理程序中被拒绝,但DataGrid中的选定行减少了2!当我再次点击ArrowUp时,TextBox会获得焦点....
  3. 如果我单击一行两次然后点击ArrowDown,则会调用一次SignalTableKeyUp()处理程序,DataGrid的SelectedIndex会在该处理程序中包含一个,但DataGrid中的选定行会增加2!当我再次点击ArrowDown时,所选行会增加1(正如预期的那样)。
  4. 有人知道这里发生了什么,或者有解决方案吗?

1 个答案:

答案 0 :(得分:0)

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

private void SignalTableKeyDown(object sender, KeyEventArgs e)
{
    // Do selection stuff in DataGrid.

    // Prevent any other actions.

    e.Handled = true;
}