代码之家  ›  专栏  ›  技术社区  ›  Michał Turczyn

无法在WPF中的文本框上设置焦点

  •  0
  • Michał Turczyn  · 技术社区  · 6 年前

    我不能集中精力在我的工作上 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
      }
    }
    

    如您所见,我试着注释出特定的行,以查看其中的一行是否导致了问题。但什么都没用。

    2 回复  |  直到 6 年前
        1
  •  0
  •   l33t    6 年前

    这个 Tab 字符将由 TextBox . 您可以尝试设置 e.Handled = true 回来之前。如果这不起作用,你需要处理 PreviewKeyDown 相反(别忘了设置 Handled 属性)。

        2
  •  0
  •   Michał Turczyn    6 年前

    这一切都是按tab键造成的。

    当我按tab键时,默认情况下 控件获得了焦点,即我处理了事件,但它被进一步传递给containing控件,containing控件将焦点设置在其他控件上。因此出现了意想不到的行为。

    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;
      }
    }