1

为什么在世界上以下属性在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()我的第一个属性的版本,即值就像{X=103, Y=235} for Location

4

2 回答 2

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
于 2013-09-16T16:30:51.330 回答
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
{
    ....
}
于 2013-09-16T15:18:32.147 回答