【发布时间】:2013-10-18 18:46:38
【问题描述】:
我正在尝试为我创建的自定义类型创建 自定义设计器或 UITypeEditor 和类型转换器。我希望能够在“应用程序设置”窗口中使用此编辑器,以便我和我的团队可以定义此类型以用于我们的创作设置。
这一点我已经成功地创建了序列化为 XML 的类,但是我为实现设计器或类型转换器所做的尝试都没有奏效,而且我已经能够完成大多数演练和示例找到关于该主题的讨论自定义表单元素,这不是我所追求的。
理想情况下,我想要的是类似于将字体添加到应用程序设置时遇到的情况。编辑设置值时,开发人员可以通过对话框轻松定义类型的属性,然后将其写入 .config 文件。这是理想的,但在这一点上,我会选择一个实际产生标准值的类型转换器。
正如我所说,我可以将值输出到 XML,但我只是不知道如何轻松定义这些值。我应该采用哪种方法才能很好地与设置设计器配合使用?
编辑
这就是我现在所处的位置。我有充当 OpenFileDialog 的代理定义的类。其原因超出了本问题的范围,但很快,它与我以编程方式控制的 UI 元素有关。
课程如下:
Public Class FileSelection
Private _selectedFile As String
Public Property SelectedFile() As String
Get
Return _selectedFile
End Get
Set(ByVal value As String)
_selectedFile = value
End Set
End Property
Private _initialDir As String
Public Property InitialDirectory() As String
Get
Return _initialDir
End Get
Set(ByVal value As String)
_initialDir = value
End Set
End Property
Private _title As String
Public Property Title() As String
Get
Return _title
End Get
Set(ByVal value As String)
_title = value
End Set
End Property
Private _filter As String
Public Property Filter() As String
Get
Return _filter
End Get
Set(ByVal value As String)
_filter = value
End Set
End Property
End Class
班级本身正在做它应该做的事情。但是在设计时编辑类的属性被证明是痛苦的。
我已经做到了像这样装饰班级:
<SettingsSerializeAs(SettingsSerializeAs.Xml)> _
<TypeConverter(GetType(FileSelectionConverter))> _
尽我所能按照微软提供的规范构建类型转换器:
Public Class FileSelectionConverter
Inherits TypeConverter
Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
If sourceType Is GetType(String) Then
Return True
End If
Return MyBase.CanConvertFrom(context, sourceType)
End Function
Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
If TypeOf value Is String Then
Dim v As String() = CStr(value).Split(",")
Dim file As New FileSelection
file.SelectedFile = Convert.ToString(v(0))
file.InitialDirectory = Convert.ToString(v(1))
file.Filter = Convert.ToString(v(2))
file.Title = Convert.ToString(v(3))
Return file
End If
Return MyBase.ConvertFrom(context, culture, value)
End Function
Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
If destinationType Is GetType(String) Then
Dim file As FileSelection
file = CType(value, FileSelection)
Return String.Format("{0},{1},{2},{3}", file.SelectedFile, file.InitialDirectory, file.Filter, file.Title)
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
Public Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
Dim values As New List(Of String)
Dim file As New FileSelection
file.SelectedFile = "<Selected File>"
file.InitialDirectory = "<Initial Directory>"
file.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"
file.Title = "<Dialog Title>"
values.Add(String.Format("{0},{1},{2},{3}", file.SelectedFile, file.InitialDirectory, file.Filter, file.Title))
Dim svc As New StandardValuesCollection(values)
Return svc
End Function
Public Overrides Function IsValid(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal value As Object) As Boolean
Return True
End Function
End Class
解决方案构建和运行没有问题,但是当我将此类添加为用于设置的类型时,我在设置设计器中完全看不到任何内容。
最令人沮丧的是,我不知道转换器是否正常工作。
任何指导将不胜感激。
【问题讨论】:
-
运动!我发现我的部分问题是我应用于我的班级的属性。这是错误的:
<SettingsSerializeAs(SettingsSerializeAs.Xml)> _ <TypeConverter(GetType(FileSelectionConverter))> _。通过删除<SettingsSerializeAs(SettingsSerializeAs.Xml)> _,我能够让类型转换器开始工作。