【问题标题】:Move Focus to next Control in WPF将焦点移到 WPF 中的下一个控件
【发布时间】:2014-06-30 23:58:05
【问题描述】:

假设我有一个DataGrid 和一个ButtonCanUserAddRows 设置为 True。让这个dataGrid有两个DataGridTextColumns,即“姓名”和“年龄”。

现在如果用户采取以下行动:

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

我看过很多问题,但我不明白用户是否将名称留空以及如何将焦点移至按钮而不是下一个单元格的逻辑。

【问题讨论】:

  • 你可以使用 button.Focus();
  • 但是在什么情况下呢?条件应该是什么?
  • 如果我理解正确的话,这是相当复杂的。您需要根据对绑定属性“Name”的检查来终止 DataGrid 的添加事务。
  • 您使用的是 MVVM 还是代码隐藏?如果有人想在他们的答案中包含代码,这将有所帮助。
  • 顺便说一句,问题更多是关于如何与 DataGridView 交互而不是移动焦点(这个很简单)。

标签: c# wpf xaml


【解决方案1】:

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

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

然后在PreviewKeyDown 事件处理程序中(KeyDown 在DataGridView 中有known issues),您可以使用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

【讨论】:

  • 什么是cell? WPF 无法识别它。
  • 很抱歉,但我收到另一个错误:无法将 FrameworkElement 隐式转换为字符串
  • 永远不会触发该事件。这是样例项目drive.google.com/file/d/0B5WyqSALui0bZnZtd2doZklUSGs/…有空的时候请看一下。
  • 你也可以谷歌这个问题,告诉我你发现了什么。这显然是 KeyDown 的一个已知问题。必须改用 PreviewKeyDown 。编辑。
  • 抱歉回复晚了。我已经出城了。我已经按照您的建议尝试了 PreviewKeyDown 而不是 KeyDown 。现在事件正确触发但cellContent is always null.
【解决方案2】:

您可以为 DataGrid.KeyDown 事件定义一个处理程序,如下所示:

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

【讨论】:

  • 但是我怎么知道这个单元格属于名称列,如果这个单元格是空的呢?
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多