繁体   English   中英

无法在WPF中将焦点设置在TextBox上

[英]Cannot set focus on TextBox in WPF

我不能将重点放在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
  }
}

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

这一切都是由于按下Tab键引起的。

如果没有按下,则控制权应集中在应有的位置上,这会产生误导。

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

解决方案是将e.Handled设置为e.Handled ,而不是使用Focus()方法(此后对事件的进一步处理将焦点设置为其他控件)设置为true ,因此不再进一步处理tab事件。

示例代码:

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

Tab字符将由TextBox在内部处理。 您可以尝试在返回之前设置e.Handled = true 如果这不起作用,则需要改为处理PreviewKeyDown (并且不要忘记设置Handled属性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM