我试图获取一个文本字段来处理Tab
和Escape
来处理用户密码字段。我目前在PreviewKeyDown
上触发了一个事件,允许我在KeyDown事件上捕获Escape
和Tab
,然后在KeyDown
事件中捕获它,如下所示:
private void passwordText_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
bool success = this.SelectNextControl(ActiveControl, true, false, true, true);
e.Handled = true;
e.SuppressKeyPress = true;
}
else if (e.KeyCode == Keys.Escape)
{
keepPassword = false;
bool success = this.SelectNextControl(ActiveControl, true, false, true, true);
e.Handled = true;
e.SuppressKeyPress = true;
}
else
{
e.Handled = false;
base.OnKeyDown(e);
}
}
private void passwordText_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Tab || e.KeyCode == Keys.Escape)
{
e.IsInputKey = true;
}
}
我遇到的问题是SelectNextControl
命令返回true,但ActiveControl
没有改变。它仍在passwordText
控件上。
它调用Leave
覆盖,然后调用Enter
覆盖。如果我从事件中删除Leave
,它会正确选择下一个控件。我在这里发布代码来自Leave
,而我在解决问题:
private void passwordText_Leave(object sender, EventArgs e)
{
if (passwordText.ReadOnly == false)
{
if (keepPassword) // This is used to handle the case of using ESC to cancel the password entry.
{
// Change user password accordingly.
password = GlobalDataStore.HashPassword(passwordText.Text);
}
else
{
keepPassword = true;
}
if (String.IsNullOrWhiteSpace(passwordText.Text))
{
passwordText.Text = "";
}
else
{
passwordText.Text = "(Hashed Password)";
}
passwordText.UseSystemPasswordChar = false;
passwordText.ReadOnly = true;
}
}
我将Leave
事件的内容移动到一个单独的函数ProcessPasswordTextLeave()
中。在KeyDown
事件内,在我执行select之前,我删除Leave
事件,执行选择,运行ProcessPasswordTextLeave()
函数,然后再次添加Leave
事件。凌乱,但它现在有效。我更喜欢更优雅的东西。我还想知道为什么将其作为Leave
事件处理还原为它。