мои настройки и описания?И получить их в собственность? - PullRequest
2 голосов
/ 03 июня 2011

Недавно я узнал об использовании объекта propertygrid с объектом my.settings для проекта. Мне это очень нравится, и мне было интересно, есть ли способ включить описания в мои настройки, чтобы они были включены в таблицу свойств на нижней панели описания?

Я нашел пару старых (2003) статей codeproj, в которых об этом говорится, но это требует большой пользовательской работы, и я надеялся, что был найден более простой способ.

Ответы [ 3 ]

1 голос
/ 09 августа 2016

Это очень просто сделать, и не требует никаких пользовательских классов . Просто откройте Settings.Designer.cs в Settings.settings в Properties в обозревателе решений. Для каждого свойства вы можете добавить описание, читаемое PropertyGrid, добавив:

[Description("Your custom description here")]

То же самое можно сделать с:

[Category("Your custom category here")]

Это требует using System.ComponentModel;.

Ваши описания будут отображаться именно так, как и ожидалось в вашем PropertyGrid, без каких-либо других работ.

ПРИМЕЧАНИЕ. Если файл будет сгенерирован заново, ваши изменения, вероятно, будут потеряны, так что об этом стоит помнить, если вы планируете редактировать с помощью инструмента авто-генерации.

0 голосов
/ 20 февраля 2013

DTools включает пару классов, которые упрощают поддержку объекта настроек прокси. Он определяет описание и атрибуты по умолчанию, которые работают с PropertyGrid и получают их значение путем поиска соответствующего атрибута в свойстве settings. Это позволяет поддерживать описание и значение по умолчанию с помощью дизайнера настроек, не забывая обновлять эти атрибуты вручную в объекте настроек прокси.

''' <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
0 голосов
/ 04 сентября 2011

Вы можете заключить настройки в простой класс со свойствами для каждого параметра, имеющегося в вашем приложении, который просто получает / устанавливает значение параметра и прикрепляет атрибут [Description("Some descr")] к каждому свойству в этом классе оболочки, чтобы показать описания в PropertyGrid.

...