使用 Reset 和 ShouldSerialize 控制属性(Windows 窗体 .NET)

本文介绍如何创建 Reset<PropertyName>ShouldSerialize<PropertyName> 方法来管理 Visual Studio 中“属性”窗口的属性。 如果属性没有简单的默认值,ResetShouldSerialize 是可以为属性提供的可选方法。 如果属性有一个简单的默认值,则应改为应用 DefaultValueAttribute,并将默认值提供给属性类构造函数。 这两种机制都支持设计器中的以下功能:

  • 如果已将属性的值修改为非默认值,则该属性会在属性浏览器中提供视觉指示。
  • 用户可以右键单击该属性,然后选择“重置”,将属性还原为其默认值
  • 设计器生成更高效的代码。

有关属性的详细信息,请参阅“Reset 和 ShouldSerialize”。

支持代码

本文通过创建指南针玫瑰控件来演示 ResetShouldSerialize 方法。 如果使用的是自己的用户控件,则可以跳过本部分。

  1. 将以下枚举添加到代码:

    public enum Directions
    {
        None,
        North,
        NorthEast,
        East,
        SouthEast,
        South,
        SouthWest,
        West,
        NorthWest,
    }
    
    Public Enum Directions
        None
        North
        NorthEast
        East
        SouthEast
        South
        SouthWest
        West
        NorthWest
    End Enum
    
  2. 添加名为 CompassRose 的用户控件。

  3. 将类型 Directions 名为 Direction 的属性添加到用户控件。

    public Directions Direction { get; set; } = Directions.None;
    
    Public Property Direction As Directions = Directions.None
    

重置

Reset<PropertyName> 方法会将相应的 <PropertyName> 属性重置为其默认值。

以下代码会将 Direction 属性重置为 None,该属性被视为指南针玫瑰控件的默认值:

private void ResetDirection() =>
    Direction = Directions.None;
Private Sub ResetDirection()
    Direction = Directions.None
End Sub

ShouldSerialize

ShouldSerialize<PropertyName> 方法会返回一个布尔值,该值指示支持属性是否已从其默认值更改,并且应序列化为设计器的代码。

Direction 属性不等于 None 时,以下代码会返回 true,指示已选择方向:

private bool ShouldSerializeDirection() =>
    Direction != Directions.None;
Private Function ShouldSerializeDirection() As Boolean
    Return Direction <> Directions.None
End Function

示例

以下代码显示了 Direction 属性的 ResetShouldSerialize 方法:

public partial class CompassRose : UserControl
{
    public Directions Direction { get; set; } = Directions.None;

    public CompassRose() =>
        InitializeComponent();

    private void ResetDirection() =>
        Direction = Directions.None;

    private bool ShouldSerializeDirection() =>
        Direction != Directions.None;
}
Public Class CompassRose

    Public Property Direction As Directions = Directions.None

    Private Sub ResetDirection()
        Direction = Directions.None
    End Sub

    Private Function ShouldSerializeDirection() As Boolean
        Return Direction <> Directions.None
    End Function

End Class