FileSelectorTypeEditor
, вероятно, является настраиваемым классом, производным от FileNameEditor или FolderNameEditor .
Вы можете реализовать и то, и другое, используя стандартный класс, или расширить стандарт по умолчанию своим собственным, как вы видели в тех C# источниках, которые вы нашли.
Здесь я использую специализированный класс FileNameEditor
, названный (с некоторым недостатком воображения) SpecializedFileNameEditor
и стандартный FolderNameEditor
, назначающий UITypeEditor
двум свойствам класс.
► Редактор свойств ImagePath
- это объект SpecializedFileNameEditor
, который использует OpenFileDialog, в котором предварительно выбран фильтр. Он также переопределяет метод EditValue
, чтобы установить текущее значение, если оно есть, связанного свойства (здесь ImagePath
) в качестве InitialDirectory OpenFileDialog.
► ImageFolder
Редактор свойств - стандартный FolderNameEditor
, который открывает FolderBrowserDialog.
Я также прикрепляю преобразователь типов ExpandableObjectConverter , чтобы вы могли представить два свойства как расширяемый селектор свойств в PropertyGrid.
Здесь вы можете увидеть пример:
Как привязать дочерние элементы управления пользовательского элемента управления к Publi c Свойство
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