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

时间:2014-05-13 10:44:48

标签: c# wpf xaml

假设我有DataGridButtonCanUserAddRows设置为True。让这个dataGrid有两个DataGridTextColumns即“Name”和“Age”。

现在,如果用户采取以下措施:

  1. 他将名字添加为XYZ,将年龄添加为20.然后按Enter键。因此,将在datagrid中添加一个新行。
  2. 他将名称添加为ABC,将年龄增加为12.然后按Enter键。因此,将在datagrid中添加一个新行。
  3. 他保持名称为空并按Enter或TAB然后我想将焦点移至Button而不是数据网格的下一个单元格。
  4. 我已经看了很多问题,但是如果用户将名称留空,我不会得到逻辑,如何将焦点移到Button而不是下一个单元格。

2 个答案:

答案 0 :(得分:2)

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

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

然后在PreviewKeyDown事件处理程序(DataGridView中具有known issues的KeyDown)中,您可以使用button.Focus()。 (more about those issues

//...
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();
        }
    }
}

关于获取列的名称,这是另一个问题,例如,您可以找到答案here

作为旁注,您并不应该直接与DataGridView单元进行交互。值,因为它意味着与数据源绑定,您应该从中检索要测试的数据。但是,您可以搜索一些可以帮助您get what you want的辅助方法。

答案 1 :(得分:0)

您可以为DataGrid.KeyDown事件定义处理程序,如:

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