WPF DataGrid 创建新行 TabStop
WPF DataGrid make new row TabStop
我有一个带有 CanUserAddRows="True" 的 DataGrid。我的 table 有多列;用户可以编辑单元格并通过按 Tab 键跳转到下一个单元格。当您在最后一列时,Tab 将带您到下一行。
但是,如果您正在编辑新行,当您在最后一列按 Tab 键时,焦点将跳转到 windows 中的下一个控件,然后才会创建新行。
我需要做的是将焦点跳转到 DataGrid 中新创建的行。老实说,我不知道从哪里开始解决这个问题。
编辑:我应该澄清一下,新行的第一列是应该获得焦点的那一列(想象一下有人只用键盘,使用制表符填充网格)。
您可以处理 DataGrid
的 PreviewKeyDown
事件以拦截 TAB
按键并以编程方式按下 ENTER
键:
<DataGrid x:Name="dg" ... PreviewKeyDown="dg_PreviewKeyDown" />
private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
e.Handled = true;
var key = Key.Enter;
var target = Keyboard.FocusedElement;
var routedEvent = Keyboard.KeyDownEvent;
dg.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(dg), 0, key)
{
RoutedEvent = routedEvent
});
}
}
我有一个带有 CanUserAddRows="True" 的 DataGrid。我的 table 有多列;用户可以编辑单元格并通过按 Tab 键跳转到下一个单元格。当您在最后一列时,Tab 将带您到下一行。
但是,如果您正在编辑新行,当您在最后一列按 Tab 键时,焦点将跳转到 windows 中的下一个控件,然后才会创建新行。
我需要做的是将焦点跳转到 DataGrid 中新创建的行。老实说,我不知道从哪里开始解决这个问题。
编辑:我应该澄清一下,新行的第一列是应该获得焦点的那一列(想象一下有人只用键盘,使用制表符填充网格)。
您可以处理 DataGrid
的 PreviewKeyDown
事件以拦截 TAB
按键并以编程方式按下 ENTER
键:
<DataGrid x:Name="dg" ... PreviewKeyDown="dg_PreviewKeyDown" />
private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
e.Handled = true;
var key = Key.Enter;
var target = Keyboard.FocusedElement;
var routedEvent = Keyboard.KeyDownEvent;
dg.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(dg), 0, key)
{
RoutedEvent = routedEvent
});
}
}