Cod*_*ody 5 .net c# user-controls winforms
对此有很多问题(一、二、三、四、五),但我尝试了所有这些问题的修复,但它们要么不起作用,要么不适合我的目的。这是我的基本结构:
User Control
|-Panel
|-Picture Box (several of them, created at runtime, do not exist at design time)
Run Code Online (Sandbox Code Playgroud)
因为我认为它是相关的,面板将其停靠栏设置为“填充”并将调整大小设置为“增长和缩小”,因此它始终覆盖整个用户控件。图片框总是覆盖面板的一部分,但通常不是全部(尽管可能)。
我特别在听Ctrl + C
,我需要一种方法,无论哪个孩子有焦点,都可以做出回应。我想要一种可以侦听任意按键的方法,以便我稍后对其进行扩展。
链接页面上的一个答案建议为这些按键设置一个全局侦听器,我不想这样做,因为如果它是后台应用程序,我不希望它关闭。另一个建议在顶级表单中检测它并将其过滤到我的用户控件。问题是向下的用户控件被构建为一个 DLL,我不想强制使用它的应用程序必须实现监听Ctrl + C
,这是它应该自己处理的事情。
1) 我没有 KeyPreview 属性在我的 UserControl 上设置为 true。关于该问题的第二个答案建议覆盖 ProcessCmdKey,这是我所做的,但无论我尝试什么,都不会调用回调。
2)这个也建议覆盖ProcessCmdKey。正如我所说,它永远不会被调用。
3)我没有接受按钮设置为true。
4)KeyDown
和PreviewKeyDown
回调都已经实现,都没有被调用。
5) 还建议使用 ProcessCmdKey。
无论焦点如何,如何在用户控制级别检测关键事件?或者,如果我尝试的上述方法应该有效,我错过了哪些设置阻止它工作?
OP:我专门监听 Ctrl + C,我需要一种无论哪个孩子拥有焦点都可以响应的方法。
Ctrl如果您想在控件中处理像+这样的组合键,C即使它没有焦点或不可选择,您也可以MenuStrip
向用户控件添加一个不可见的控件,并向其添加一个项目并为其分配快捷方式。然后处理项目的点击事件并执行您需要的操作。
即使您的控件不包含焦点,每次用户按Ctrl+时都会引发单击事件。C
您还可以使用代码来完成此操作:
public UserControl1()
{
InitializeComponent();
var menu = new MenuStrip();
var item = new ToolStripMenuItem();
item.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C;
item.Click += item_Click;
menu.Items.Add(item);
menu.Visible = false;
this.Controls.Add(menu);
}
void item_Click(object sender, EventArgs e)
{
MessageBox.Show("Ctrl + C");
}
Run Code Online (Sandbox Code Playgroud)
笔记
如果没有焦点,您将无法处理按键事件,但是使用MenuStrip
上述方法可以捕获您想要的快捷键。
使其工作的原因是Form
isContainerControl
和ContainerControl
CallsToolStripManager.ProcessCmdKey
方法,该方法ProcessCmdKey
会导致处理ToolStripManager
.
有关更多信息,请查看 的源代码ContainerControl.ProcessCmdKey
。
归档时间: |
|
查看次数: |
1301 次 |
最近记录: |