2010-07-27 32 views
6

için bir varsayılan öğe olduğunu nasıl bilir? DefaultValue() tarafından desteklenen türlerden biri olmadığında tasarımcı bir özelliğin varsayılan değerini nasıl bildirir? Örneğin, Padding veya Font.C# tasarımcısı C: C#

Normalde, bir Windows Forms denetimi kullandığınızda, varsayılan değerler Özellikler penceresinde normal bir yazı tipinde olur ve değiştirilen (varsayılan olmayan) değerler kalın yazılır. Örneğin. Bu örnekte

Image of properties windows with non-default values in bold

, ShowAddress varsayılan değeri false ve ShowName varsayılan değeri true olduğunu. Bu etki aşağıdaki ile elde edilir: Ben Padding için bir şeyler yapmak çalıştı

[DefaultValue(false)] 
public bool ShowAddress { 
    get { return mShowAddress; } 
    set { 
    mShowAddress = value; 
    Invalidate(); 
    } 
} 

[DefaultValue(true)] 
public bool ShowName { ... } 

Ancak, ben sefil başarısız oldu:

[DefaultValue(new Padding(2))] 
public Padding LabelPadding { ... } 

Hangi tabii derlemek olmaz.

Bunu nasıl yapmalıyım?

cevap

8

bu deneyin:

private static Padding DefaultLabelPadding = new Padding(2); 
private internalLabelPadding = DefaultLabelPadding; 
public Padding LabelPadding { get { return internalLabelPadding; } set { internalLabelPadding = value; LayoutNow(); } } 

// next comes the magic 
bool ShouldSerializeLabelPadding() { return LabelPadding != DefaultLabelPadding; } 

mülkiyet tarayıcı her özellik XYZ için ShouldSerializeXYZ adında bir fonksiyonu arar. Ne zaman ShouldSerializeXYZ yanlış döndürür, kod oluşturma sırasında hiçbir şey yazmaz.

DÜZENLEME: dokümantasyon:

+0

O için çalışmak görünmüyor ben mi. Visual C# 2008'i kullanarak. Kodu girdikten sonra, özelliği varsayılana geri yükledikten sonra form tasarımcısına yazdı ve bir kez daha Properties Penceresindeki cıvatayı çıkarmadı. –

+0

Ayrıca, Visual C# 2010 –

+0

'da da çalışmıyor. Üzgünüm, yanlış ad verdim. Ayrıca belgelere bir bağlantı ekledim. –

18

bu deneyin:

[DefaultValue(typeof(Padding), "2, 2, 2, 2")] 
public Padding LabelPadding 
{ 
    get { return _labelPadding; } 
    set { _labelPadding = value; } 
}