为什么我的财产只能出现

时间:2013-09-16 14:58:59

标签: .net vb.net propertygrid

为什么世界上的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} }。

2 个答案:

答案 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