【问题标题】:Form KeyUp and KeyDown events to change variables形成 KeyUp 和 KeyDown 事件来改变变量
【发布时间】:2012-01-08 00:26:53
【问题描述】:

在我的应用程序中,我有:

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 时,清除返回 TRUE。

显然我在这里写的代码不起作用!有什么问题和/或有更好的方法吗?

【问题讨论】:

    标签: c# .net winforms events keyboard


    【解决方案1】:

    这是一个简单的修复,当你释放密钥时,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;
    }
    

    这个条件唯一成立的时候是当控制权由它自己控制时。 else 情况的目的是在您按下 ctrl 后跟另一个键时将 _clear 设置为 true,因为一旦按下控制,它将触发 KeyDown 事件。

    基于此更改,只要您注意 if 语句之后的按键(例如 else 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
    
       }
    
    }
    

    【讨论】:

    • 谢谢,我也试过了,但是有问题。我还有其他快捷方式,例如 CTRL+A 和那种东西。如果我出于其他目的按下 CTRL+A(它是菜单项的快捷方式),这将不是一个可靠的解决方案。有办法吗?
    • 已修复,请查看答案底部。
    • 你好,我也试过这种方式。遗憾的是问题依然存在。例如,当我按下 CTRL+O 打开 FileOpenDialog 时会发生这种情况,即使在对话框关闭后 _clear 也会保持为假,所以我必须再按一次 CTRL。是否有可能避免这种行为?
    • 好吧,目前我正在为此使用 SHIFT 键,因为它不是任何东西的快捷方式,所以效果很好。不过如果能解决控制键的问题就好了!
    【解决方案2】:

    如果你反过来这样做,要容易得多。检查 CTRL 键是否在树视图的事件中按下。像这样的:

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
            if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
                // Control key is down, do something...
            }
        }
    

    【讨论】:

    • 谢谢,这对鼠标来说没问题,但是如果用户使用箭头键并输入会怎样。我也有在项目更改时自动激活。
    • 哦,知道了,我用同样的方式处理树形视图的关键事件,还是不?
    • 是的,无论您是否关心 CTRL 键是否按下。
    【解决方案3】:

    您需要将表单的 KeyPreview 属性更改为 True。

    【讨论】:

    • 谢谢,这部分工作,它使_clear False,但KeyUp 事件不知何故不起作用,_clear 保持为假。有什么想法吗?
    • 我尝试了一个测试表单,您的问题没有出现,在调试模式下,您只会看到一个事件触发,但 2 个事件正在触发检查按键事件的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多