2

我最近了解到项目的 my.settings 对象使用 propertygrid 对象。我非常喜欢这个,我想知道是否有办法在我的设置中包含描述,以便将它们包含在下部描述面板的属性网格中?

我发现了几篇涵盖此内容的旧(2003 年)codeproj 文章,但它需要大量自定义工作,并希望有一种更简单的方法可以解决。

4

3 回答 3

1

这非常简单,不需要任何自定义类。只需Settings.Designer.cs在您的解决方案资源管理器中Settings.settings打开。Properties对于每个属性,您可以通过添加以下内容添加可读的描述PropertyGrid

[Description("Your custom description here")]

也可以这样做:

[Category("Your custom category here")]

这些需要using System.ComponentModel;.

您的描述将完全按照您的预期显示PropertyGrid,无需其他工作。

注意:如果重新生成文件,您的更改可能会丢失,因此如果您计划通过自动生成工具进行编辑,请注意这一点。

于 2016-08-09T16:51:29.847 回答
0

DTools包含一对类,可以更轻松地维护您的代理设置对象。它定义了使用的描述和默认属性,PropertyGrid并通过在设置属性中查找相应的属性来获取它们的值。这允许您使用设置设计器维护描述和默认值,而无需记住在代理设置对象中手动更新这些属性。

''' <summary><see cref="DescriptionAttribute"/> that takes its value from <see cref="System.Configuration.SettingsDescriptionAttribute"/></summary>
''' <author www="http://dzonny.cz">Đonny</author>
''' <version version="1.5.2" stage="RC"><see cref="VersionAttribute"/> and <see cref="AuthorAttribute"/> removed</version>
Public Class SettingsInheritDescriptionAttribute : Inherits DescriptionAttribute
    ''' <summary>CTor</summary>
    ''' <param name="Settings">The data type that contains property with name specified in <paramref name="Property"/></param>
    ''' <param name="Property">Name of the property which's <see cref="SettingsDescriptionAttribute"/> initializes this attribute</param>
    ''' <param name="AlternateDescription">Alternative description used in case of failure of getting description form specified property</param>
    Public Sub New(ByVal Settings As Type, ByVal [Property] As String, Optional ByVal AlternateDescription As String = "")
        '#If VBC_VER >= 9 Then
        MyBase.New(If(AlternateDescription = "", [Property], AlternateDescription))
        '#Else
        '            MyBase.New(iif(AlternateDescription = "", [Property], AlternateDescription))
        '#End If
        Me.Settings = Settings
        Me.Property = [Property]
    End Sub
    ''' <summary>The data type that contains property with name spacified in <see cref="[Property]"/></summary>
    Private Settings As Type
    ''' <summary>Name of the property which's <see cref="SettingsDescriptionAttribute"/> initializes this attribute</summary>
    Private [Property] As String
    ''' <summary>Gets or sets the string stored as the description.</summary>
    ''' <returns>The string stored as the description. The default value is an empty string ("").</returns>
    Public Overrides ReadOnly Property Description() As String
        Get
            Dim sds As Object() = Settings.GetProperty([Property]).GetCustomAttributes(GetType(SettingsDescriptionAttribute), True)
            If sds IsNot Nothing AndAlso sds.Length > 0 Then
                Return CType(sds(0), SettingsDescriptionAttribute).Description
            Else
                Return MyBase.DescriptionValue
            End If
        End Get
    End Property
End Class
''' <summary><see cref="DefaultValueAttribute"/> that takes its value from <see cref="System.Configuration.DefaultSettingValueAttribute"/></summary>
''' <author www="http://dzonny.cz">Đonny</author>
''' <version version="1.5.2" stage="RC"><see cref="VersionAttribute"/> and <see cref="AuthorAttribute"/> removed</version>
Public Class SettingsInheritDefaultValueAttribute : Inherits DefaultValueAttribute
    ''' <summary>CTor</summary>
    ''' <param name="Settings">The data type that contains property with name defined in <paramref name="Property"/></param>
    ''' <param name="Property">Name of property from which's <see cref="DefaultSettingValueAttribute"/> this attribute is initialized</param>
    ''' <param name="Type">The data type of the value</param>
    ''' <param name="AlternateDefaultValue">Alternative default value used when fetching fails</param>
    Public Sub New(ByVal Settings As Type, ByVal [Property] As String, ByVal Type As Type, Optional ByVal AlternateDefaultValue As String = "")
        MyBase.New(Type, AlternateDefaultValue)
        Me.Settings = Settings
        Me.Property = [Property]
        Me.ValueType = Type
    End Sub
    ''' <summary>CTor for default values of <see cref="String"/> type</summary>
    ''' <param name="Settings">The data type that contains property with name defined in <paramref name="Property"/></param>
    ''' <param name="Property">Name of property from which's <see cref="DefaultSettingValueAttribute"/> this attribute is initialized</param>
    Public Sub New(ByVal Settings As Type, ByVal [Property] As String)
        Me.New(Settings, [Property], GetType(String))
    End Sub
    ''' <summary>Contains value of the <see cref="Settings"/> property</summary>
    <EditorBrowsable(EditorBrowsableState.Never)> Private _Settings As Type
    ''' <summary>Contains value of the <see cref="[Property]"/> property</summary>
    <EditorBrowsable(EditorBrowsableState.Never)> Private [_Property] As String
    ''' <summary>Contains value of the <see cref="ValueType"/> property</summary>
    <EditorBrowsable(EditorBrowsableState.Never)> Private _ValueType As Type
    ''' <summary>Gets the default value of the property this attribute is bound to.</summary>
    ''' <returns>An <see cref="System.Object"/> that represents the default value of the property this attribute is bound to.</returns>
    ''' <remarks>Default values can be obtained if stored in form that can be directly returned or if stored as XML-serialized values.</remarks>
    Public Overrides ReadOnly Property Value() As Object
        Get
            Dim sds As Object() = Settings.GetProperty([Property]).GetCustomAttributes(GetType(DefaultSettingValueAttribute), True)
            If sds IsNot Nothing AndAlso sds.Length > 0 Then
                Try
                    Dim mySerializer As Xml.Serialization.XmlSerializer = New Xml.Serialization.XmlSerializer(ValueType)
                    Dim stream As New System.IO.StringReader(CType(sds(0), DefaultSettingValueAttribute).Value)
                    Return mySerializer.Deserialize(stream)
                Catch
                    Dim a As New DefaultValueAttribute(ValueType, CType(sds(0), DefaultSettingValueAttribute).Value)
                    Return a.Value
                End Try
            Else
                Return MyBase.Value
            End If
        End Get
    End Property
    ''' <summary>The data type that contains property with name defined in <see cref="[Property]"/></summary>
    Public Property Settings() As Type
        Get
            Return _Settings
        End Get
        Protected Set(ByVal value As Type)
            _Settings = value
        End Set
    End Property
    ''' <summary>Name of property from which's <see cref="DefaultSettingValueAttribute"/> this attribute is initialized</summary>
    Public Property [Property]() As String
        Get
            Return [_Property]
        End Get
        Protected Set(ByVal value As String)
            [_Property] = value
        End Set
    End Property
    ''' <summary>The data type of the value</summary>
    Public Property ValueType() As Type
        Get
            Return _ValueType
        End Get
        Protected Set(ByVal value As Type)
            _ValueType = value
        End Set
    End Property
End Class

像这样使用它:

Public Class ProxySettings
    ''' <summary>Wraps <see cref="My.MySettings.SomeSetting"/> property</summary>
    <SettingsInheritDescription(GetType(My.MySettings), "SomeSetting")> _
    <SettingsInheritDefaultValue(GetType(My.MySettings), "SomeSetting")> _
    Public Property SomeSetting() As Decimal
        Get
            Return My.Settings.SomeSetting 
        End Get
        Set(ByVal value As Decimal)
            My.Settings.SomeSetting = value
        End Set
    End Property
End Class
于 2013-02-20T17:21:05.223 回答
0

您可以将设置包装在一个简单的类中,其中包含应用程序中每个设置的属性,该属性只是获取/设置设置值并将属性附加[Description("Some descr")]到该包装类中的每个属性以显示 PropertyGrid 中的描述。

于 2011-09-04T16:04:41.273 回答