首页 > 解决方案 > 无法在 WPF 中的 TextBox 上设置焦点

问题描述

我无法将注意力集中在我的 上TextBox,我有以下代码:

private void txbUid_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Key != Key.Tab) return; // here control doesn't loose focus

  string stringUid = txbUid.Text;
  long uid;

  if (!TryParseUid(stringUid, out uid))
  {
    //string errMsg = $"Niepoprawny kod UID: {stringUid}";
    //lblError.Text = errMsg;
    //this.LogError(errMsg);
    //txbUid.Text = "";
    //txbUid.Focus();
    return; // here control looses focus
  }
}

如您所见,我尝试注释掉特定行以查看其中是否导致问题。但没有任何效果。

标签: c#wpf

解决方案


这一切都是由按下标签按钮引起的。

如果没有按下它,控制就会保持应有的焦点——这是误导性的。

当我按下选项卡时,默认情况下,下一个控件获得焦点,即我处理了事件,但它被进一步传递给包含控件,后者将焦点设置在其他控件上。因此意外的行为。

解决方案是在事件中设置e.Handled,而不是使用Focus()方法(之后进一步处理事件将焦点设置为其他控件),true因此不会进一步处理按下选项卡事件。

示例代码:

private void txbUid_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Key != Key.Tab) return; // here control doesn't loose focus

  string stringUid = txbUid.Text;
  long uid;

  if (!TryParseUid(stringUid, out uid))
  {
    // no need to comment out anything
    string errMsg = $"Niepoprawny kod UID: {stringUid}";
    lblError.Text = errMsg;
    this.LogError(errMsg);
    txbUid.Text = "";
    // mark event as handled
    e.Handled = true;
    return;
  }
}

推荐阅读