为什么世界上的PropertyGrid
Public Property Location() As PointF
Get
Return New PointF(mLeft, mTop)
End Get
Set(ByVal value As PointF)
mLeft = value.X
mTop = value.Y
End Set
End Property
虽然同一对象的以下属性看起来很好(读/写):
Public Property Size() As SizeF
Get
Return New SizeF(mWidth, mHeight)
End Get
Set(ByVal value As SizeF)
mWidth = value.Width
mHeight = value.Height
End Set
End Property
事实上,PropertyGrid
会显示我的第一个属性的ToString()
版本,即Location
的值类似于 {X = 103,Y = 235} }。
答案 0 :(得分:1)
因为SizeF定义了默认TypeConverter:
[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true), TypeConverter(typeof(SizeFConverter))]
public struct SizeF
{
...
}
虽然PointF没有:
[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct PointF
{
....
}
答案 1 :(得分:1)
对于其他任何人撞墙而言,这里是PointFConverter
课程:
Imports System.ComponentModel
Public Class PointFConverter
Inherits ExpandableObjectConverter
Public Overrides Function CanConvertFrom(context As ITypeDescriptorContext, sourceType As Type) As Boolean
If sourceType = GetType(String) Then
Return True
Else
Return MyBase.CanConvertFrom(context, sourceType)
End If
End Function
Public Overrides Function ConvertFrom(context As ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object) As Object
If TypeOf value Is String Then
Try
Dim s As String = DirectCast(value, String)
Dim converterParts As String() = s.Split(","c)
Dim x As Single = 0.0F
Dim y As Single = 0.0F
If converterParts.Length > 1 Then
x = Single.Parse(converterParts(0).Trim())
y = Single.Parse(converterParts(1).Trim())
ElseIf converterParts.Length = 1 Then
x = Single.Parse(converterParts(0).Trim())
End If
Return New PointF(x, y)
Catch
Throw New ArgumentException("Cannot convert [" + value.ToString() + "] to pointF")
End Try
End If
Return MyBase.ConvertFrom(context, culture, value)
End Function
Public Overrides Function ConvertTo(context As ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object, destinationType As Type) As Object
If destinationType = GetType(String) Then
If value.[GetType]() = GetType(PointF) Then
Dim pt As PointF = DirectCast(value, PointF)
Return String.Format("{0}, {1}", pt.X, pt.Y)
End If
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
End Class
只需将其应用于您的财产:
<TypeConverter(GetType(PointFConverter))> _
Public Property Location() As PointF
Get
Return New PointF(mLeft, mTop)
End Get
Set(ByVal value As PointF)
mLeft = value.X
mTop = value.Y
End Set
End Property