簡體   English   中英

如何在列表上設置DefaultValueAttribute <Color> 集合屬性(設置默認顏色)?

[英]How to set DefaultValueAttribute on List<Color> collection property (set default colors)?

因此,當我嘗試設置DefaultValueAttribute時,我為自定義控件聲明了List集合屬性,它不會編譯並顯示錯誤:

屬性參數必須是屬性參數類型的常量表達式,typeof表達式或數組創建表達式

..我在做什么錯?

    private List<Color> _gradientColorList = new List<Color>();
    [CategoryAttribute("Appearance")]
    [DefaultValueAttribute(new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }))]
    public List<Color> GradientColorList
    {
        get
        {
            return _gradientColorList;
        }
        set
        {
            try
            {
                if (value == null)
                    throw new ArgumentNullException();
                if (value == null || value.Count < 2)
                    throw new Exception("Gradient color list count is less than 2.");
                _gradientColorList = value;
                CreateGradientList(GradientColorList);
                Invalidate();
            }
            catch (Exception exc)
            {
                ExcMessageBox(exc);
            }
        }
    }

還有一個問題,當我在Visual Studio屬性編輯器(顏色集合編輯器)中從GradientColorList集合屬性中添加或刪除顏色時,包含try-catch的set塊不起作用,我也不知道為什么? 如何解決?

代替使用DefaultValueAttribute,您可以將gradientColorList分配為

private List<Color> _gradientColorList = new List<Color>(new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));

對於第二部分,無論何時在列表中添加或刪除實體,都不會調用設置器。 僅在將值分配給“ GradientColorList”時才會調用它。 如果將其綁定到UI,則最好使用ObserverableCollection,當添加或刪除實體時,它會內部觸發集合更改事件。

正如編譯器告訴您的那樣:您不能使用List<>作為屬性的參數來創建。 您提供給屬性的所有參數必須恆定。 這意味着它們不應更改。 雖然陣列滿足此條件,但您無法動態添加或刪除項目的動態列表。 嘗試用列表創建常量,它將不起作用:

const List<Color> COLORS = new List<Color>();

如果要提供默認值,我認為可以使用以下3個選項:

  • _gradientColorList設置為默認值:

     private _gradientColorList = new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) })); 
  • 將您的get函數更改為以下內容:

     if (_gradientColorList == null) { return new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) })); } return _gradientColorList; 
  • 使用數組而不是列表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM