使用案例的关键修饰符不起作用?

时间:2014-05-12 16:42:37

标签: c#

我已经定义,当一个键关闭时,使用案例区分各种键,就会发生一个动作

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.B:
            //something happens here
        break;
    }
}

当我尝试添加一个键修饰符时,例如“Ctrl”,我这样做了

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.B && e.Modifiers == Keys.Control:
            //something happens here
        break;
    }
}

编辑:当我尝试这样做时,它会显示'&&' Cannot be applied to operands of type 'Windows.System.Forms.Keys' and 'bool'

如何正确完成?

3 个答案:

答案 0 :(得分:3)

您不能将if语句作为案例标签的一部分。 Case直接将标签中的常量值与开关中的变量进行比较; &&运算符的结果是bool,无法与KeyEventArg进行比较。您需要单独添加或使用if语句。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.B:
            if (e.Modifiers == Keys.Control)
                //something happens here
            //else
            break;
    }
}

答案 1 :(得分:1)

  

我做错了吗?

当然,你是! case标签不是条件,它们是与switch内的表达式相比较的值。

您可以在需要检查其他条件的每个if内添加一个case,或使用if - then - else链:

private void Form1_KeyDown(object sender, KeyEventArgs e) {
    if (e.KeyCode == Keys.B && e.Modifiers == Keys.Control) {
        //something happens here
    } else if (...) {
    } else {
    }
}

答案 2 :(得分:0)

从其他答案开始,你仍然可以使用case语句,通过制作一个Tuple并根据哈希码检查案例,因为Tuple是一个引用类型,例如。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    int hash = new Tuple<Keys, Keys>(e.KeyCode, e.Modifiers).GetHashCode();
    switch (hash)
    {
        case new Tuple<Keys, Keys>(Keys.B, Keys.Control).GetHashCode():
            //something happens here
        break;
    }
}