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

时间:2018-10-09 07:42:07

标签: c# 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
  }
}

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

2 个答案:

答案 0 :(得分:0)

所有这些都是由按下选项卡按钮引起的。

如果未按下该按钮,则控件应保持应有的聚焦状态-这具有误导性。

当我按下Tab键时,默认情况下, next 控件获得了焦点,即我处理了该事件,但是该事件进一步传递给了包含控件的控件,该控件将焦点放在其他控件上。因此发生了意外的行为。

解决方案是将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;
  }
}

答案 1 :(得分:0)

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