使用 Reset 和 ShouldSerialize 來控制屬性 (Windows Forms .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. 將名為 Direction 且類型為 Directions 的屬性新增至使用者控制項。

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

Reset

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