2012-10-12 95 views
7

如何你自定義控件,即設置默認屬性,當他們第一次拖動到在設計的形式?C#的WinForms自定義控件默認屬性

這裏或者通過谷歌無法找到一個答案;我所得到的是如何限制這些值。

使用寬度&高度的例子,如果我在構造函數中設置他們,他們會應用於每次的設計在控制打開。我如何將它們設置爲默認值,在用戶更改屬性之後再次應用這些默認值?

+0

你可以舉一個如何將它應用到基類屬性的例子嗎? –

+0

道歉 - 它是'[DefaultValue(someValue)]'。下面是一個鏈接到MSDN的例子:http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute%28v=vs.90%29.aspx – Bridge

+0

我認爲DefaultValue屬性就是你需要。 Visual Studio IDE會將該屬性中指定的默認值放在Designer文件中。如果用戶將默認值更改爲其他值,則Visual Studio IDE將使用新值更新Designer文件。當控制將被重新打開時,這將防止重新載入以前的值,因爲默認值已被覆蓋。 – jags

回答

-1

在構造函數中,設置要當你把它拖到畫布上出現你的屬性值。 或者如果它們是基本控件的內置屬性,則將它們設置在設計器代碼類中。

+1

設置屬性在構造使它們被每一個設計師被打開時應用,有效地意味着它們不能設置。 –

-1

下面將允許您添加值時,顯示的形式,在這之後,你可以將其設置爲你想要的。

private int widthLength = 5; 

public int Width {  

    get { return widthLength ; } 
    set { widthLength = value; 
} 
+1

利用這一點,默認屬性沒有得到當控件拖動到在設計的形式應用。我也得到一個編譯器的警告,它隱藏了繼承的成員;加入「新」的指示,由報警不改變行爲。 –

5

嘗試使用DefaultValue屬性。

private int height; 

[DefaultValue(50)] 
public int Height 
{ 
    get 
    { 
     return height; 
    } 
    set 
    { 
     height=value; 
    } 
} 
+1

作爲高基類屬性不被它覆蓋這不起作用。 –

2

對我而言,對於我不能覆蓋的屬性,我使用的是new運算符。例如,ListView控件上的MultiSelect屬性。我想MultiSelect默認爲false,但我仍然希望能夠更改它。

如果我只是將它設置爲false在構造函數中,或在InitializeComponent,這個問題(我認爲)是默認值仍然是true,所以如果我在設計中,設計師告示值設置爲truetrue是默認值,因此根本不設置該屬性,而不是明確地將其設置爲它認爲已經是默認值的屬性。但是這個值最終變成了false,因爲那是在構造函數中設置的值。

爲了解決這個問題,我用下面的代碼:

/// <summary>Custom ListView.</summary> 
public sealed partial class DetailsListView : ListView 
{ 
    ... 

    [DefaultValue(false)] 
    public new bool MultiSelect { 
     get { return base.MultiSelect; } 
     set { base.MultiSelect = value; } 
    } 

這允許控制仍然有一個正常MultiSelect屬性,默認爲false,而不是true和財產仍然在被切換新的控制。

編輯:我遇到過有使用抽象的形式做的問題。我一直在使用抽象表單類,並在我需要使用設計器時切換到具體的實現。我發現當我切換繼承的類時,我的自定義控件上的屬性將重置爲舊的默認值。我似乎已經通過在自定義控件的構造函數中將屬性設置爲默認值來糾正了此行爲。