我最近了解到项目的 my.settings 对象使用 propertygrid 对象。我非常喜欢这个,我想知道是否有办法在我的设置中包含描述,以便将它们包含在下部描述面板的属性网格中?
我发现了几篇涵盖此内容的旧(2003 年)codeproj 文章,但它需要大量自定义工作,并希望有一种更简单的方法可以解决。
我最近了解到项目的 my.settings 对象使用 propertygrid 对象。我非常喜欢这个,我想知道是否有办法在我的设置中包含描述,以便将它们包含在下部描述面板的属性网格中?
我发现了几篇涵盖此内容的旧(2003 年)codeproj 文章,但它需要大量自定义工作,并希望有一种更简单的方法可以解决。
这非常简单,不需要任何自定义类。只需Settings.Designer.cs
在您的解决方案资源管理器中Settings.settings
打开。Properties
对于每个属性,您可以通过添加以下内容添加可读的描述PropertyGrid
:
[Description("Your custom description here")]
也可以这样做:
[Category("Your custom category here")]
这些需要using System.ComponentModel;
.
您的描述将完全按照您的预期显示PropertyGrid
,无需其他工作。
注意:如果重新生成文件,您的更改可能会丢失,因此如果您计划通过自动生成工具进行编辑,请注意这一点。
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
您可以将设置包装在一个简单的类中,其中包含应用程序中每个设置的属性,该属性只是获取/设置设置值并将属性附加[Description("Some descr")]
到该包装类中的每个属性以显示 PropertyGrid 中的描述。