Pattern per aggiungere attributi personalizzati alle classi di controllo di Forms, senza avere lo stesso codice ovunque?

1

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.

    
posta Katu 29.04.2015 - 07:12
fonte

1 risposta

1

L'interfaccia ICustomTypeDescriptor implementata sul tuo i componenti ti permetteranno di mostrare solo le proprietà che desideri o di iniettare le proprietà su altri oggetti. Tuttavia, è solo per la griglia della proprietà. Non ti aiuterà con l'API o la serializzazione del codice.

    
risposta data 01.05.2015 - 00:53
fonte

Leggi altre domande sui tag