【问题标题】:C# UserControl keyboard short cutsC# 用户控制键盘快捷键
【发布时间】:2012-06-29 20:30:53
【问题描述】:

我创建了一个包含多个文本框、组合框等的用户控件。用户控件托管在普通表单上。我想为文本框、组合框分配键盘快捷键。这样当同时按下 Ctrl + F 时,焦点就会放在其中一个文本框上。我尝试使用 OnPreviewKeyDown 检查键,然后在用户控件上触发 key down 方法。调试器甚至没有点击表单上的 OnPreviewKeyDown 方法。我已在表单上启用 keyPreview 为真。我在下面提供了一些我的实验。

谁能指出我哪里出错了?我无法相信这样的事情是如此困难。我一定错过了一些简单的东西。谢谢

protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
    {
        Keys k = e.KeyCode;

        UserControl1.UserControl_KeyPress(k);
    }

    public void UserControl_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 'F')
            tbxHostName.Focus();

        switch (e.KeyCode)
        {
            case Keys.F:
                this.cmbxProtocol.Focus();
                break;
            case Keys.H:
                this.tbxHostName.Focus();
                break;
            default:
                break;
        }
    }

【问题讨论】:

  • 你知道焦点在 UserControl 上吗?否则,您可能必须处理表单中的关键事件并让该代码选择用户控件中的文本区域。
  • 指明这是 WPF 还是 Winforms

标签: c# user-controls keyboard-shortcuts


【解决方案1】:

我建议尝试KeyDown Event。它接受一个 KeyEventArgs 参数,其中包括一个专门用于 Ctrl 键的布尔值 (KeyEventArgs.Control)。

在您的情况下,您会将KeyCode 属性与Keys.F 进行比较,以查看是否按下了F,并检查Control 是否为真。例如:

public void UserControl_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control)
    {
        switch (e.KeyCode) 
        { 
            case Keys.F: 
                this.cmbxProtocol.Focus(); 
                break; 
            // Other cases ...
            default: 
                break; 
        }
    }
} 

或者,如果你真的想坚持你的 KeyPress 事件,你可以检查静态 Control.ModifierKeys 属性的值,看看是否按下了 Ctrl 键,如下所示:

if( (Control.ModifierKeys & Keys.Control) == Keys.Control )
{
    //...
}

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2014-04-30
    • 2011-04-08
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多