【问题标题】:C# custom ENTER key behaviourC# 自定义 ENTER 键行为
【发布时间】:2017-08-13 09:27:38
【问题描述】:

我有一个小型项目,我希望几个按钮在单击或 Ctrl+单击时表现不同。为了实现这一点,这些按钮中的每一个都在其 Click() 事件中附加了这种功能:

private void Button1_Click(object sender, EventArgs e)
    {
        int value = 10 //default value
        bool boool = false; 
        if (ModifierKeys == Keys.Control)
        {
            using (var form = new NUP_Popup(0, value, value, "maximum ?")) 
            { //creates a simple window that allows user to change the value of 'value'
                form.ShowDialog();
                if (form.DialogResult == DialogResult.OK)
                {
                    value = form.retVal;
                    boool = true;
                }
                else return;
            }
        }
        //do stuff here, either with default or user value
    }

现在,单击或 Ctrl+单击的行为与此功能的预期相同。我的问题是,当使用 Enter 键激活我的按钮时,此行为不适用:单独的 Enter 键会触发“正常”行为,但 Ctrl+Enter 什么也不做(按钮未激活)。

我已经重写了 ProcessDialogKey() 函数以在按下 Escape 时关闭窗口,所以我想我可以使用它来使 Enter 按键触发 Click() 事件函数:

protected override bool ProcessDialogKey(Keys keyData)  //Allows quit when Esc is pressed
    {
        if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }
        if (keyData == Keys.Return)
        {
            this.OnClick(new EventArgs());
        }
        return base.ProcessDialogKey(keyData);
    }

这就是我卡住的地方。当然这并没有做任何事情,但我真的不知道在我的第二个条件中输入什么以使其工作。

也许我使用了错误的方法?有人能指出我正确的方向吗?

【问题讨论】:

  • 第二个条件是什么意思?我会使用类似KeyDown 表单的事件来执行此操作。

标签: c# button onclick enter ctrl


【解决方案1】:

假设您放置了一个 ID 为 Label1 的 Label 和一个 ID 为 Button1 的按钮,如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Button Clicked";
        if (Control.ModifierKeys == Keys.Control) label1.Text += " with Ctrl";
    }

    private void button1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == '\n') button1_Click(sender, new EventArgs());
    }

对于您的解决方案,只需将 KeyPress 事件添加到您的 Button1 并在按键事件 Button1_KeyPress 中应用以下代码:

if (e.KeyChar == '\n') Button1_Click(sender, new EventArgs());

【讨论】:

  • 好吧,我认为它会起作用,但这意味着我将有 2 个函数对表单的 10 个按钮中的每一个执行相同的操作,为了清楚起见,我想避免这种情况。
  • 是的。除非您不更改 Windows 键盘的基本功能,否则您必须走这条路
【解决方案2】:

好的,所以我终于找到了一个可行的解决方案,将它添加到我重写的 ProcessDialogKey() 方法中:

if (keyData == (Keys.Enter | Keys.Control))
        {
            (this.ActiveControl as Button).PerformClick();
        }

我不知道它是否符合“干净”代码的条件,但它具有满足我的 2 个要求的优点:使 Ctrl+Enter 的功能与 Ctrl+Click 一样,而不必为每个 Button 声明 2 个方法。

【讨论】:

  • 这不是您问题的答案。因为当用户按下 ctrl 键时触发时钟事件是不合逻辑的。
【解决方案3】:

我找到了一个解决方案,可以让您单击 Enter 或 Ctrl+Enter:

private void txtIP_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\n' || e.KeyChar == '\r') btnStart_Click(sender, new EventArgs());
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2019-04-05
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2013-08-11
    相关资源
    最近更新 更多