扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Public Overloads Overrides Function GetEditStyle( _ ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle Return UITypeEditorEditStyle.DropDown End Function |
Private Function LoadResourceImage(ByVal resourceName As String) As Image Debug.Assert(Not resourceName Is Nothing) Dim ImageStream As System.IO.Stream = Me.ResourceAssembly.GetManifestResourceStream(resourceName) Return System.Drawing.Bitmap.FromStream(ImageStream) End Function |
Public Overloads Overrides Function EditValue(...) '存储上下文信息以用于下拉ListBox事件处理器。 '创建并使用可用的图像资源名填充该ListBox。 '添加我们的特殊“Browse...”项。 '绑定ListBox事件。 '在一个下拉窗口中显示该ListBox。 End Function |
三、 几个关键问题与解案
为了开发ResourceImageEditor,我创建了一个重载Image属性的MyPictureBox(派生自System.Windows.Forms.PictureBox),以便把ResourceImageEditor指定为该Image属性的类型编辑器。
然后,我编译这个控件的代码。之后,就可以把该MyPictureBox控件放到一个表单上并且调用下拉框用户接口......
鼠标接口工作得很好。然而,当我使用键盘选择一项然后按下回车键时,该下拉列表框消失,而且我的选定内容丢失了(也就是说,前一个选择图像并没有改变)。我很快发现,当按下回车键时,该ListBox并没有生成KeyDown事件。
尽管ESC键也产生KeyDown事件,但这不是一个问题;因为该下拉列表框会被自动关闭,而且我不必处理当前选择项。
很明显,在ListBox控件能够处理它们之前,这个属性格“屏蔽”了ENTER和ESC键。
为了简化而且还要解决问题,我要使用ProcessDialogKey方法。在消息预处理期间(处理对话字符,例如TAB、RETURN、ESCAPE和箭头键)时,调用这个方法。这个方法是在System.Windows.Forms.Control类内声明的—它简单地把该调用代理给该控件的父级(如果有的话)。我已经子类化该ListBox控件,并且重载了ProcessDialogKey方法来拦截回车键,如下所示:
Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean If keyData = System.Windows.Forms.Keys.Return Then RaiseEvent EnterPressed(Me, EventArgs.Empty) Return True 'True意味着我们已经处理了相应的键 Else Return MyBase.ProcessDialogKey(keyData) End If End Function |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者