在WPF中将焦点移到下一个控件

本文关键字:下一个 控件 焦点 WPF | 更新日期: 2023-09-27 18:03:10

假设我有一个DataGrid和一个Button。"CanUserAddRows"设置为"True"。让这个dataGrid有两个DataGridTextColumns,即"Name"answers"Age"。

现在如果用户采取以下操作:

  1. 他添加名字为XYZ,年龄为20。然后按回车键。因此,一个新的行将被添加到数据网格。
  2. 他把名字加为ABC,年龄加为12。然后按回车键。因此,一个新的行将被添加到数据网格。
  3. 他保持名称为空并按Enter或TAB,然后我想将焦点移动到Button而不是数据网格的下一个单元格。

我看了很多问题,但我没有得到的逻辑,如果用户留下的名称为空,我如何将焦点移动到按钮,而不是下一个单元格。

在WPF中将焦点移到下一个控件

使用DataGridView.SelectedCells[0],这样您就可以检索所选单元格的值(假设您只能选择一个)。

要获得实际的字符串,您必须将内容强制转换为适当的WPF对象,如TextBlock。myCell.Column.GetCellContent(cell.Item) as TextBlock

然后在PreviewKeyDown事件处理程序(KeyDown在DataGridView中有已知问题)中,您可以使用button.Focus()。(关于这些问题的更多信息)

//...
myDataGrid1.PreviewKeyDown += myDataGrid1_KeyDown;
//...
void myDataGrid1_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Enter)
    {
        var cell = myDataGrid1.SelectedCells[0];
        TextBlock cellContent = cell.Column.GetCellContent(cell.Item) as TextBlock;
        if (cellContent != null)
        {
            if (String.IsNullOrWhitespace(cellContent.Text))
                button.Focus();
        }
    }
}

关于获取列名,这是另一个问题,您可以在这里找到答案。

作为旁注,您实际上不应该直接与DataGridView单元格的值进行交互,因为它意味着与数据源绑定,您应该从中检索想要测试的数据。但是,您可以稍微搜索一下帮助器方法,这些方法可以帮助您获得所需的内容。

可以为DataGrid定义一个处理程序。KeyDown事件,如:

void myDataGrid1_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Enter)
    {
        button.Focus();
    }
}