三、 几个关键问题与解案
为了开发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 |
不是从ProcessDialogKey实现内部生成KeyDown事件,我决定使用一种更为直接的方式:EnterPressed事件。为了,我修改了ResourceImageEditor.EditValue的实现以处理这一事件(而不是KeyDown事件),而且一切都非常顺利。
你可以使用这一技术来拦截任何Control派生的类(你使用它来实现你的类型编辑器中的下拉UI)中的ENTER键。
查看本文来源