一、 简介
首先,本文假定你已经熟悉VB.net和Visual Studio.NET Windows表单设计器。
在开发定制Windows表单控件时,提供我们自己的下拉框类型编辑器来操作控件的属性常常是非常方便的。定制的类型编辑器不仅可以提供更为丰富的设计时刻体验,而且可能成为用户是否喜欢你的控件的决定因素。
如果你决定创建你自己的下拉式类型编辑器,那么它应该遵循与内置的下拉框类型编辑器相类似的模式。让我们以Anchor属性为例。一种典型的操作该属性的设计时刻用户交互描述如下:
· 用户选择属性格子中的Anchor属性并且点击属性格右边的下拉按钮。
· 一种良好的图形控件是下拉框,它能够允许用户使用鼠标点击边缘或者使用箭头键来高亮某个边缘并使用空格键选择/取消选择它。
· 用户可以通过按下ENTER键或点击下拉控件的外部来接收变化。为了取消这一变化,用户可以按下ESC键。
下面,让我们来讨论具体的实现技术。
二、 实现
首先,让我们构建一个ResourceImageEditor类型编辑器,它允许从当前文件系统中选择一个图像文件(就象内置的ImageEditor类一样)或者从一个程序集的manifest文件中选择一个图像资源。而且,在用户体验方面,该ResourceImageEditor的行为应该类似于系统内置的类型编辑器。下面是对我们要求的概述:
1. 当用户从属性格子中选择一个属性时,该格子就会显示出来—以一个下拉框UI形式显示可以编辑的属性。
2. 当点击下拉按钮时,当前程序集中的所有图像资源将显示出来。
3. 当用户选择一个图像资源项,相应的图像即可以从程序集中进行加载。
4. 允许选择一个图像文件,并且在下拉列表框中的最后一项将标记为“Browse...”。当用户点按“Browse...”项,将显示经典的打开文件对话框,用户能够从中选择一个图像文件。
5. 通过单击鼠标或使用箭头键高亮某项并按回车键实际选择它从而允许用户从该下拉列表框中选择一项。这个下拉选择可以通过按下ESC键取消。
ResourceImageEditor是一个类型编辑器,因此它直接或间接地派生自System.Drawing.Design.UITypeEditor类。我决定从内置的System.Drawing.Design.ImageEditor类进行派生是因为它已经实现了图像文件选择功能。也就是说,ImageEditor.EditValue实现将显示一个文件打开对话框以允许用户从文件系统中选择一个图像文件。然后,从我的派生类中调用这一功能只需要简单地调用MyBase.EditValue即可。
为了实现上面第一个要求(在属性格子中显示下拉箭头按钮),我必须重载GetEditStyle方法以从UITypeEditorEditStyle枚举中返回适当的常数:
Public Overloads Overrides Function GetEditStyle( _
ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle
Return UITypeEditorEditStyle.DropDown
End Function
为了显示图像资源列表,我必须列举一个给定程序集中的所有资源并且仅在列表中显示图像资源。为了简化,我决定使用一种简单的约定:当一个资源名以一个有效图像文件扩展名(.bmp,.jpg?http://www.xvna.com,.gif?http://www.xvna.com...)结束时,