C# C:Windows窗体:在面板/图片盒中输入键盘?

C# C:Windows窗体:在面板/图片盒中输入键盘?,c#,.net,user-interface,winforms,C#,.net,User Interface,Winforms,我正在使用windows窗体为游戏制作关卡编辑器。表单有几个下拉菜单、文本框等,用户可以在其中键入信息 我想让像CTRL+V或CTRL+A这样的命令可以在游戏世界中使用,而不是文本操作。游戏世界由包含在面板中的图片盒表示 此事件处理程序从未触发: private System.Windows.Forms.Panel canvas; // ... this.canvas = new System.Windows.Forms.Panel(); // ... this.canvas.PreviewKe

我正在使用windows窗体为游戏制作关卡编辑器。表单有几个下拉菜单、文本框等,用户可以在其中键入信息

我想让像CTRL+V或CTRL+A这样的命令可以在游戏世界中使用,而不是文本操作。游戏世界由包含在面板中的图片盒表示

此事件处理程序从未触发:

private System.Windows.Forms.Panel canvas;
// ...
this.canvas = new System.Windows.Forms.Panel();
// ...
this.canvas.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.canvas_PreviewKeyDown);

这样做的首选方式是什么?面板甚至可以接收键盘输入吗?我希望允许用户在使用文本输入时使用“复制/粘贴/选择所有”命令,但在游戏世界中放置对象时不能使用这些命令。

来自MSDN Control文档。可以选择:

中的Windows窗体控件 以下列表不可选择,并且 将为 可以选择属性。派生控件 从这些控件中也不存在 可选择

面板 分组框 图片框 进度条 分离器 标签 控件中不存在链接时的链接标签 虽然它说从这些控件派生的控件无法接收焦点,但您可以创建派生控件并使用SetStyle方法启用可选样式。您还必须将TabStop属性设置为true,才能工作

public class SelectablePanel : Panel
{
    public SelectablePanel()
    {
        this.SetStyle(ControlStyles.Selectable, true);
        this.TabStop = true;
    }
}

然后使用此控件而不是普通面板。您可以按预期处理PreviewKeyDown事件。

您可能希望在表单级别执行密钥捕获。强烈建议您阅读帮助编写底层.NET代码的人员的文章: