2012-10-12 9 views
7

Come impostare le proprietà predefinite per i controlli personalizzati, vale a dire quando vengono trascinati prima nel modulo in Designer?C# WinForms Proprietà predefinite di controllo personalizzato

Impossibile trovare una risposta qui o tramite Google; tutto quello che ottengo è come vincolare i valori.

Utilizzo di larghezza & Altezza come esempi, se li ho impostati nel costruttore vengono applicati al controllo ogni volta che il Designer viene aperto. Come faccio a impostarli su un valore predefinito che non viene mai applicato nuovamente dopo che l'utente ha modificato le proprietà?

+0

Puoi dare un esempio di come applicarlo per basare le proprietà della classe? –

+0

Ci scusiamo - è '[DefaultValue (someValue)]'. Ecco un link al MSDN su di esso con esempio: http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute%28v=vs.90%29.aspx – Bridge

+0

Penso che l'attributo DefaultValue sia ciò che bisogno. L'IDE di Visual Studio inserirà il valore predefinito specificato nell'attributo nel file Designer. Se l'utente modificherà il valore predefinito con qualche altro valore, Visual Studio IDE aggiornerà il file Designer con un nuovo valore. Ciò impedirà il ricaricamento del valore precedente quando il controllo verrà riaperto poiché il valore predefinito è già stato sovrascritto. – jags

risposta

-1

Nel costruttore, impostare i valori delle proprietà che si desidera vengano visualizzate quando si trascina il disegno nell'area di disegno. Oppure se sono le proprietà incorporate del controllo di base, quindi impostarle nella classe di codice del designer.

+1

L'impostazione delle proprietà nel costruttore fa sì che vengano applicate ogni volta che il designer viene aperto, il che significa che non possono essere impostate. –

-1

Il seguente consentirà di aggiungere il valore quando si visualizza il modulo, dopo di che è possibile impostarlo come si desidera.

private int widthLength = 5; 

public int Width {  

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

Utilizzando questo, le proprietà predefinite non vengono applicate quando il controllo viene trascinato nel modulo in Designer. Ricevo anche un compilatore che avverte che nasconde il membro ereditato; aggiungere 'nuovo' come indicato dall'avviso non modifica il comportamento. –

5

Provare a utilizzare l'attributo DefaultValue.

private int height; 

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

Questo non funziona in quanto la proprietà della classe base per Altezza non viene sovrascritta da essa. –

2

Quello che ha funzionato per me per le proprietà che non possono ignorare sta utilizzando l'operatore new. Ad esempio, la proprietà MultiSelect su un controllo ListView. Voglio MultiSelect di default su false, ma voglio ancora poterlo modificare.

Se ho appena impostato a false nel costruttore, o in InitializeComponent, il problema (credo) è che il valore di default è ancora true, quindi se ho impostato il valore a true nella finestra di progettazione, gli avvisi di design che true è l'impostazione predefinita e pertanto non imposta la proprietà affatto piuttosto che impostarla in modo esplicito su ciò che pensa sia già l'impostazione predefinita. Ma poi il valore finisce per essere false, perché è ciò che è impostato nel costruttore.

Per ovviare a questo problema ho usato il seguente codice:

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

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

Questo permette il controllo di avere ancora un MultiSelect proprietà funzionante che il default è false piuttosto che true, e la proprietà può ancora essere attivati ​​sul nuovo controllo.

EDIT: Ho riscontrato un problema relativo all'utilizzo di moduli astratti. Ho utilizzato classi di moduli astratti, con un'implementazione concreta a cui sono passato quando ho bisogno di utilizzare il designer. Ho scoperto che quando ho cambiato la classe che stavo ereditando da quella proprietà sul mio controllo personalizzato si resettava ai vecchi valori predefiniti. Mi sembra di aver corretto questo comportamento impostando le proprietà sui valori predefiniti nel costruttore del controllo personalizzato.