用户控件上的默认按钮






3.57/5 (3投票s)
如何在用户控件上创建一个默认按钮,或者模拟一个 AcceptButton。
引言
在设计窗体时,AcceptButton
和 KeyPreview
属性对于自动化响应用户的操作(例如按下 Enter 键、ESC 键等)非常有用。 当您创建自己的用户控件时,这些属性是不可用的。 至少,不是直接可用的。
背景
使用 Windows 内置的消息传递系统可以帮助我们解决这个问题。
这就是我们要做和编写的代码
我们想要实现的目标是,当用户按下我们想要响应的键时,能够收到通知。 例如,您设计了一个搜索对话框用户控件,就像 Windows 资源管理器中的文件搜索一样。 当用户按下 Enter 键时,搜索应该开始。 为了确定按下的键,您可以为每个子控件使用 _KeyUp
事件,这会使代码看起来很糟糕,而且绝不是一种干净的编程风格。 这就是我们的用户控件 KeyPreview 功能发挥作用的地方。 为了在用户控件级别实现键验证,我们使用 .NET 框架的 UserControl
基类实现的函数 ProcessKeyPreview
。 要控制它,只需在类级别声明对其的 **重写** 即可。
Public Class myUserControl
Public Event onEnterKey(ByVal sender As System.Object, ByVal e As System.EventArgs)
Public Event onF4(ByVal ControlName As String)
Private Const WM_KEYDOWN = &H100
Protected Overrides Function ProcessKeyPreview(ByRef m As _
System.Windows.Forms.Message) As Boolean
If m.Msg = WM_KEYDOWN Then
Select Case m.WParam.ToInt32
Case ConsoleKey.Enter
RaiseEvent onEnterKey(button01, New System.EventArgs)
Case ConsoleKey.F4
RaiseEvent onF4(MyBase.ActiveControl.Name)
End Select
End If
Return MyBase.ProcessKeyPreview(m)
End Function
End Class
摘要
使用这种技术,您可以为用户控件的消费者提供类似窗体类的功能。 您甚至可以实现一个名为 AcceptButton
或 CancelButton
的属性,以提供更大的灵活性。