我无法将重点放在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
}
}
如您所见,我尝试注释掉特定行,以查看其中是否引起了问题。但是没有任何效果。
答案 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
属性)。