Sto creando designer di winform personalizzati. Io uso label, textbox, combobox, listbox, pulsante e checkbox sul designer. Non voglio mostrare tutte le loro proprietà su PropertyGrid
, quindi ho creato un attributo personalizzato e impostato la griglia per mostrare solo le proprietà contrassegnate con tale.
propertyGrid1.BrowsableAttributes = new AttributeCollection(
new MyAttribute()
);
Il problema è che ora devo creare esattamente lo stesso codice per ciascuno dei controlli. Ho una propria classe wrapper per ogni controllo di cui ho bisogno, derivata dal controllo esistente.
class MyButton : Button
{
[MyAttribute]
[Category("Common properties")]
public new string Name { get { return base.Name; } set { base.Name = value; } }
}
class MyLabel : Label
{
[MyAttribute]
[Category("Common properties")]
public new string Name { get { return base.Name; } set { base.Name = value; } }
}
...
Al momento ho 7 proprietà da ogni controllo, che ho sempre bisogno di mostrare.
The question
:
C'è un pattern che posso usare per avere una sola classe che ha quelle proprietà e "iniettarle" in qualche modo, invece di copiare lo stesso codice per tutti i controlli? Ho solo 6-8 controlli, ma non mi piace l'idea di avere lo stesso codice scritto in molti punti.
Dovrei in qualche modo trovare le proprietà di cui ho bisogno e aggiungere il mio attributo (e categoria) personalizzato a quelli in fase di runtime? Sarebbe "bit" hacky, ma potrebbe funzionare?
Usando l'interfaccia: dovrei ancora implementarla, ottenendo così la stessa quantità di codice. Non posso usare i generici: sto usando i controlli originali come base, perché il codice del designer li gestisce bene fuori dalla scatola e l'uso di generics causa un casino e molta personalizzazione.