FileSelectorTypeEditor
可能是派生自任一自定义类文件名编辑器 or 文件夹名称编辑器.
您可以使用标准类来实现这两者,也可以使用您自己的类扩展默认值,正如您在找到的那些 C# 源代码中所看到的那样。
这里我用的是专门的FileNameEditor
类,命名(有点缺乏想象力)SpecializedFileNameEditor
和标准FolderNameEditor
分配UITypeEditor
一个类的两个属性。
► The ImagePath
属性编辑器是SpecializedFileNameEditor
对象,它使用 OpenFileDialog,其中预先选择了过滤器。它还会覆盖EditValue
方法,设置关联属性的当前值(如果有)(此处,ImagePath
) 作为 OpenFileDialog 的 InitialDirectory。
► The ImageFolder
属性编辑器是一个标准FolderNameEditor
,这将打开一个FolderBrowserDialog。
我还附上一个可扩展对象转换器类型转换器,因此您可以将这两个属性呈现为 PropertyGrid 中的可扩展属性选择器。
您可以在此处查看示例:
如何将用户控件的子控件绑定到公共属性
Imports System.ComponentModel
Imports System.Drawing.Design
Imports System.IO
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
<TypeConverter(GetType(ExpandableObjectConverter))>
Public Class ImagePickerClass
Public Sub New()
' Initialize [...]
End Sub
<Editor(GetType(SpecializedFileNameEditor), GetType(UITypeEditor))>
Public Property ImagePath As String
<Editor(GetType(FolderNameEditor), GetType(UITypeEditor))>
Public Property ImageFolder As String
Public Class SpecializedFileNameEditor
Inherits FileNameEditor
Private currentValue As String = String.Empty
Public Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
If TypeOf value Is String Then
currentValue = DirectCast(value, String)
End If
Return MyBase.EditValue(context, provider, value)
End Function
Protected Overrides Sub InitializeDialog(ofd As OpenFileDialog)
MyBase.InitializeDialog(ofd)
If Not currentValue.Equals(String.Empty) Then
ofd.InitialDirectory = Path.GetDirectoryName(currentValue)
End If
ofd.Filter = "PNG Images (*.png)|*.png"
End Sub
End Class
End Class