在我的申请中,我有:
private bool _clear = true;
此布尔值用于查看当用户向其中输入新文本时是否应清除文本框(通过按TreeView中的TreeNode)。
然后我为我的表格提供了这两个事件:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = false;
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = true;
}
}
我想以某种方式当用户持有CTRL键,清除为FALSE并且当CTRL被释放时,clear将返回TRUE。
显然我在这里写的代码不起作用!什么可能是错的和/或有更好的方法吗?
答案 0 :(得分:2)
这是一个简单的修复,因为当您释放密钥时,KeyUp事件不会收到任何已释放密钥的信息,因此只需将该属性设置为true:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_clear = true;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = false;
}
}
如果您希望实时查看它,请在表单中添加标签,并在“_clear”变量的每个设置下添加:
label1.Text = _clear.ToString();
根据您的评论,将第二个代码块更改为:
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(other shortcut conditionals go here or on other else if's)
{
_clear = true;
}
此条件唯一适用的时间是控制本身。其他情况是为了将_clear设置为true,当你按下ctrl后跟另一个键时,由于按下控件后它会触发KeyDown事件。
根据这一变化,只要你在if语句之后处理按键,(例如if if()),你就不需要在KeyUp事件中设置任何东西了。
如果您想要更深入的信息,请参阅my answer here to the intricacies of keys and their properties。
编辑#3:
只要您在每个条件的第一行设置_clear为true,您就应该能够避免在评论中遇到的问题:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(e.KeyData.ToString() == "O, Control")
{
_clear = true;
//Do other stuff here, such as opening a file dialog
}
}
答案 1 :(得分:2)
如果您以相反的方式执行此操作,则很多更容易。检查树视图事件中的CTRL键是否已关闭。像这样:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
// Control key is down, do something...
}
}
答案 2 :(得分:1)
您需要将表单的KeyPreview属性更改为True。