Come specificare Padding e Margin nello XAML di WPF
Ci sono molte cose che non mi entrano in testa. Per quante volte mi vengano spiegate, o per quante volte possa leggerle, non mi entrano in testa. Una di queste è il modo con cui specificare il Padding ed il Margin dei controlli WPF.
Il Padding rappresenta lo spazio interno tra il contenuto di un controllo ed i suoi bordi. Il Margin rappresenta lo spazio tra il bordo del controllo e quello che gli sta accanto. Ci sono diversi modi per specificare questo valore. Il modo più comune è quello di indicare un solo valore alla proprietà Margin o Padding, come nell’esempio qui sotto:
<Label Padding="0" Background="Orange">Cognome :</Label>
Impostare Padding = “0” significa che la distanza tra il testo “Cognome :” ed il bordo della Label stessa è pari a zero. In pratica la scritta è attaccata al bordo su tutti e quattro i lati. Proviamo ad editare a mano lo XAML in questo modo:
<Label Padding="6" Background="Orange">Cognome :</Label>
Questa volta abbiamo impostato Padding=”6″: ciò significa che ci sono 6 device-independent pixels tra la scritta ed il bordo della Label. Tale distanza è applicata in ugual misura su tutti e quattro i lati.
Fin qua le cose sono semplici. Il fatto è che possiamo specificare Padding e Margin con più di un valore, per indicare distanze diverse per i quattro lati. Mi spiego meglio. Supponiamo di avere il seguente XAML:
<Label Padding="0,10,20,30" Background="Orange">Data di Nascita :</Label>
A questa Label è stato dato un Padding=”0,10,20,30″. I valori vanno letti nell’ordine Left, Top, Right e Bottom (ed è questo quello che non mi ricordo mai). Quindi, il testo sarà appiccicato al bordo sinistro, sarà a 10 pixel dal bordo superiore, sarà a 20 pixel dal bordo destro e a 30 pixel dal bordo inferiore. La stessa logica vale ovviamente per la proprietà Margin.
C’è anche la possibilità di specificare due valori soltanto. Per esempio:
<Label Padding="30, 6" Background="Orange">Data di Nascita :</Label>
In questo caso il primo valore (30) viene usato per impostare il Padding a sinistra e a destra, mentre il secondo valore (6) viene usato per impostare il Padding per l’alto ed il basso.
Chi ci sta dietro? ThicknessConverter!
Qualcuno si chiederà come è possibile che WPF riconosca quelle stringhe e come faccia a convertirle in valori double per continuare il processo di layout dei pannelli e dei controlli. Il segreto sta nella classe ThicknessConverter, che si preoccupa di convertire dal tipo string al tipo Thickness e viceversa. Tale classe è contenuta nell’assembly PresentationFramework.dll del Framework 3.0. Mi sono divertito ad esplorarla velocemente con Reflector, e anche dal codice si deduce come faccia uso di un metodo internal FromString che tra le altre cose è soggetto alla localizzazione della nostra applicazione, dal momento che uno dei parametri in ingresso è un CultureInfo. E si vede chiaramente che a seconda del numero di valori presenti nella nostra stringa, viene utilizzato un costruttore diverso della classe Thickness.
Riassumendo: l’ordine
Cioè, quello che mi dimentico più spesso.
X = stesso valore su tutti e quattro i lati
X, Y = X per il Left ed il Right; Y sul Top ed il Bottom
X, Y, Z, K = Left, Top, Right e Bottom
Technorati Tags: programming WPF