【问题标题】:Getting a composite user control to handle KeyDown events获取复合用户控件来处理 KeyDown 事件
【发布时间】:2014-04-15 13:53:14
【问题描述】:

我有一个导入复合用户控件的 WinForm 应用程序(计算器)。用户控件有一个 keyDown 事件处理程序,用于将键盘链接到控件上的按钮。启动我的程序时,没有识别或执行任何 keyDown 事件。

在阅读了一些类似的帖子后,我现在认为这与焦点不在我的控制范围内有关。我尝试在我的 WinForm 加载上执行 CalcCompCtrl1.focus() 无济于事。我该如何解决这个问题?

为什么在我的 Form.vb 中创建 keyDown 事件处理程序并简单地传递信息不起作用?

Private Sub Calc_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

    CalcCompCtrl1.MyCalc_KeyDown(sender, e)

End Sub

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

    这是行不通的,UserControl 坚持不采取焦点。如果您尝试使用大锤,它将强制它使用客户端控件之一。 KeyPreview hack 也无法工作,它是 UserControl 没有的 VB6 遗留属性。

    您必须改写ProcessCmdKey()。 Winforms 将其称为before,它会在具有焦点的控件上触发 KeyDown 事件。如果您使用了击键,则从方法中返回 true,如果没有,请调用 base.ProcessCmdKey()。要有选择性,你不想吞下所有东西,否则键盘导航(光标键和制表键)之类的基本东西会停止工作。

    【讨论】:

    • 调试后,我发现我的上述代码只需将 KeyDown 事件参数发送到我的控制 KeyDown 函数即可工作。 (1 分钟没用,下一分钟没用??)感谢您提供此信息,但我预计我很快就会需要它。
    【解决方案2】:

    在表单上启用 KeyPreview。这是一个属性。

    尝试将 MyBase 更改为 Calc-Object-Variable 的 Variable-Name!

    【讨论】:

    • 我将 KeyPreview 设置为 true,但这并没有解决问题。我编辑了上面的代码。你的意思是在我上面改变的把手之后?似乎没有影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2011-05-14
    • 2012-06-27
    • 1970-01-01
    • 2010-09-10
    • 2015-01-15
    相关资源
    最近更新 更多