0

我有一个小表格,里面有 9 个复选框。我正在尝试为与 Numpad 对应的那些框制作热键,但我的时间最长。我有两个主要问题:

1.

 private void checkBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.NumPad7)
        {
            MessageBox.Show("It's working");

        }
    }

那是我的代码。它有效,但没有做我想要的。它会显示一条消息,但前提是该复选框被突出显示。我认为 KeyPreview 在这种情况下可能会有所帮助,但 MSDN 数据库并没有帮助我解决我试图弄清楚如何使 KeyPreview 工作的问题。

其次,我希望代码在我按下热键时选中该框。我认为使用 CheckState 的任何组合似乎都不起作用。如果有人有一些煽动,我将不胜感激。


评论中的代码:

public Form2() 
{ 
    InitializeComponent(); 
    this.KeyPreview = true; 
    this.KeyDown += new KeyEventHandler(Form2_KeyDown);
} 

private void Form2_KeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
        case Keys.NumPad7: 
            MessageBox.Show("ABC"); 
            break; 

        default: 
            break; 
    } 
} 
4

3 回答 3

1

您的问题并未说明您是否希望这是特定于应用程序的热键或系统热键。我在假设它是特定于应用程序的假设下进行操作。您的假设是正确的,您需要将 Forms KeyPreview 属性设置为 true。然后,您需要将用于设置和清除复选框的代码放入 Forms Keydown 事件中,如下所示:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode )
    {
        case Keys.NumPad1:
            if (checkBox1.Checked)
                checkBox1.Checked = false;
            else
                checkBox1.Checked = true;

            break;
        case Keys.NumPad2:
            if (checkBox2.Checked)
                checkBox2.Checked = false;
            else
                checkBox2.Checked = true;

            break;
        case Keys.NumPad3:
            if (checkBox3.Checked)
                checkBox3.Checked = false;
            else
                checkBox3.Checked = true;

            break;
        case Keys.NumPad4:
            if (checkBox4.Checked)
                checkBox4.Checked = false;
            else
                checkBox4.Checked = true;

            break;
        case Keys.NumPad5:
            if (checkBox5.Checked)
                checkBox5.Checked = false;
            else
                checkBox5.Checked = true;

            break;
        case Keys.NumPad6:
            if (checkBox6.Checked)
                checkBox6.Checked = false;
            else
                checkBox6.Checked = true;

            break;
        case Keys.NumPad7:
            if (checkBox7.Checked)
                checkBox7.Checked = false;
            else
                checkBox7.Checked = true;

            break;
        case Keys.NumPad8:
            if (checkBox8.Checked)
                checkBox8.Checked = false;
            else
                checkBox8.Checked = true;

            break;
        case Keys.NumPad9:
            if (checkBox9.Checked)
                checkBox9.Checked = false;
            else
                checkBox9.Checked = true;

            break;
        default:
            break;
        }
    }

然后,您可以为 CheckedChanged 事件创建一个通用的 EventHandler,并检查选择了哪个 Checkbox 来运行相应的方法。

void checkBox_CheckedChanged(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;

    switch(cb.Name)
    {
        case "checkBox1":
            if (cb.Checked)
                // Method to use when checkBox1 is checked
            else
                // Method to use when checkBox1 is unchecked


            break;

        case "checkBox2":
            if (cb.Checked)
                // Method to use when checkBox2 is checked
            else
                // Method to use when checkBox2 is unchecked

            break;

        case "checkBox3":
            if (cb.Checked)
                // Method to use when checkBox3 is checked
            else
                // Method to use when checkBox3 is unchecked

            break;

        default:
            break;

        //Implement your other checkBox's the same way.
        }

    }
于 2013-03-18T02:04:16.763 回答
1

现在可以在要使用 ALT 启用的字母之前简单地添加一个 & 符号。欲了解更多信息:

https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-create-access-keys?view=netdesktop-5.0

于 2021-04-13T02:15:28.967 回答
0

为所有复选框中的事件分配相同的事件处理程序:

_checkbox1.KeyDown += checkBox_KeyDown;
_checkbox2.KeyDown += checkBox_KeyDown;

// And so on...

然后,在里面做检查:

private void checkBox_KeyDown(object sender, KeyEventArgs e)
{
    var checkbox = sender as CheckBox;
    if (checkbox == null) { return; }

    if (e.KeyCode == Keys.NumPad1)
    {
        _checkbox1.IsChecked = !_checkbox1.IsChecked;
        return;
    }

    if (e.KeyCode == Keys.NumPad2)
    {
        _checkbox2.IsChecked = !_checkbox2.IsChecked;
        return;
    }

    // And so on...
}
于 2013-03-17T23:11:52.640 回答