c# - 无法在 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
}
}
如您所见,我尝试注释掉特定行以查看其中是否导致问题。但没有任何效果。
解决方案
这一切都是由按下标签按钮引起的。
如果没有按下它,控制就会保持应有的焦点——这是误导性的。
当我按下选项卡时,默认情况下,下一个控件获得焦点,即我处理了事件,但它被进一步传递给包含控件,后者将焦点设置在其他控件上。因此意外的行为。
解决方案是在事件中设置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;
}
}
推荐阅读
- css - 全局安装时无法在 React-app 中包含引导程序
- c++ - 在 GLFW 窗口中启用多重采样不会提高抗锯齿的质量
- php - 支付网关中使用的 resource.cgn 文件是什么,什么程序可以打开它以查看其内容?
- python - 什么是警告“在 mel 频率基础上检测到空过滤器”。' 关于?
- java - java.util.NoSuchElementException 错误,scan.next() 问题
- android - 如何将 FAB 塑造成圆角按钮(药丸形状),类似于联系人应用程序的联系人详细信息屏幕?
- sql - 用第二个表中的值更新第一个表中的列
- php - 如何根据页面内容使 setSignatureAppearance() 位置动态?
- java - Java android显示对话框而不是片段
- javascript - 如何在烧瓶中使用 ajax 从 sql 调用用户名?