XAML, di che si tratta?

di Riccardo Golia, in Windows Vista,

Dopo aver parlato del modello applicativo di Longhorn e dell'oggetto Application nei post precedenti, passiamo a vedere cosa ha da offrirci di tanto interessante il linguaggio XAML.

Essendo un documento XML well-formed, una pagina XAML contiene uno o più elementi organizzati gerarchicamente che controllano il layout e il comportamento della pagina stessa. Esiste un unico elemento radice, ciascun elemento può avere un solo padre, ma più figli. E' interessante notare che ogni nome di un elemento corrisponde al nome di una classe managed. Del resto ogni elemento XAML deriva da System.Windows.UIElement oppure da System.Windows.ContentElement a seconda dei casi. In generale si possono raggruppare gli elementi in quattro macro-categorie:

  1. controlli (derivano dalla classe System.Windows.Control), che permettono di gestire l'interazione con l'utente;
  2. panels (derivano dalla classe System.Windows.Panel), che fungono da contenitori di elementi e permettono di suddividere la pagina in porzioni in cui gli elementi risultano raggruppati;
  3. elementi testuali (derivano da System.Windows.TextElement), che permettono di gestire la formattazione del testo;
  4. forme che gestiscono le rappresentazioni grafiche vettoriali.

1) Controlli
Si tratta dei controlli che siamo abituati ad usare in Windows, ovvero pulsanti, checkbox, radio buttons, combo, dropdownlist, menu, scrollbar, slider, ecc. Un aspetto interessante è che XAML consente di combinare diversi controlli al fine di ottenerne uno composito, ovvero una combinazione dei controlli costituenti (si parla di control composition). L'esempio classico è quello del pulsante con una immagine. Basta annidare l'elemento Image tra il tag di apertura e chiusura dell'elemento Button e il gioco è fatto. Facile, no?

2) Panels
Rappresentano dei contenitori di elementi. Ne esistono di diversi tipi, per tutte le esigenze:

  • Canvas, che permette di posizionare gli elementi interni usando le coordinate relativamente all'area del panel;
  • DockPanel, che consente di organizzare gli elementi interni sia in senso verticale che orizzontale (Top, Bottom, Left, Right, Center);
  • FlowPanel, che permette di posizionare gli elementi interni in modo adattivo in base alle interruzioni di linea;
  • TextPanel, per organizzare contenuti testuali secondo diversi layout (per esempio, per colonne);
  • GridPanel, per rappresentare griglie di dati;
  • FixedPanel, per rappresentare gli elementi interni secondo una struttura di layout fissa (non adattivo).

3) Elementi testuali
Sono elementi che permettono di gestire la formattazione del testo e la struttura dei documenti (Text).

4) Forme
XAML supporta la grafica vettoriale grazie alle Shapes (Ellipse, Line, Rectangle, Path, Polygon, ecc.), utili per disegnare forme geometriche, ai diversi tipi di Transforms (RotateTransform, TranslateTransform, ScaleTransform, SkewTransform, ecc.), ovvero trasformazioni delle proprietà di un oggetto, e le Animations, che non sono altro che trasformazioni protratte nel tempo.

Oltre a quanto visto sopra, esistono degli elementi pensati per gestire al meglio la visualizzazione on-line dei documenti (come nel caso di applicazioni navigabili). PageViewer è un controllo disegnato per la visualizzazione, paginazione e navigazione di contenuti on-line, un po' come avviene con un browser Web. Il controllo suddivide automaticamente i contenuti in diverse pagine e fornisce gli strumenti necessari per navigare da una pagina all'altra. I contenuti possono essere rappresentati secondo un layout adattivo (adaptive flow), al fine di occupare tutto lo spazio a disposizione, oppure fisso, indipendente dalle dimensioni della finestra e/o dello schermo o dal tipo di dispositivo di output. Esistono per l'appunto degli elementi che consentono di ottenere uno o l'altro tipo di layout.

Dato un elemento, è possibile associare ad esso una collection di risorse (il nome della collection è Resources). Si tratta di un modo per riutilizzare oggetti o valori comuni. Se una risorsa non è definita nella collection di un elemento, questa viene ricercata nella collection dell'elemento padre. Definendo per esempio delle risorse per un elemento Canvas, è possibile utilizzare queste risorse nell'ambito di tutti gli elementi figli del panel (Canvas.Resources). Gli stili sono un tipo particolare di risorsa (il nome della classe è Style).

Dopo tanti bla bla bla, è arrivato il momento di mostrare qualche esempio...

Codice C# ed equivalente in XAML

Questo frammento di codice C# crea una finestra, in essa scrive "Tutti al Windows Development Day!" (mi raccomando accorrete in tanti!) tramite un controllo SimpleText (colore nero e dimensione del carattere uguale a 10pt) e la rende visibile.
myWindow = new MSAvalon.Windows.Window();
myElement = new MSAvalon.Windows.Controls.SimpleText();
myElement.Text = "Tutti al Windows Development Day!";
myElement.Foreground = new MSAvalon.Windows.Media.SolidColorBrush
(Colors.Black);
myElement.FontSize = new FontSize(10, FontSizeType.Point);
myWindow.Children.Add(myElement);
myWindow.Show();
 
Notare che in XAML elementi e attributi hanno nomi uguali a quelli delle classi e proprietà corrispondenti. Nel tag di apertura di Window l'attributo Visible="true" equivale alla linea di codice myWindow.Show();.
<Window xmlns="http://schemas.microsoft.com/2003/xaml" Visible="true">
    <SimpleText Foreground="Black"
        FontSize="10">Tutti al Windows Development Day!</SimpleText>
</Window>

Control composition

Come si fa ad ottenere un pulsante contenente una immagine usando XAML e control composition? Ecco un esempio.
<Button>
    <Image Source="aspitalia.jpg" />
</Button>

Collection delle risorse e stili

Come si vede, lo stile è un tipo di risorsa e ad esso può essere assegnato un nome o meno. A me ricorda qualcosa dei CSS e a voi?
<Border
    xmlns="http://schemas.microsoft.com/2003/xaml" xmlns:def="Definition">
    <FlowPanel>
        <FlowPanel.Resources>
            <SolidColorBrush def:Name="MyColor" Color="Gold"/>
            <Style>
                <Button Background="Green" FontSize="15"/>
            </Style>
            <Style def:Name="MyStyle">
                <Button Background="Red" FontSize="24"/>
            </Style>
        </FlowPanel.Resources>
        <Button>Bottone di colore verde</Button>
        <Button Style="{MyStyle}">Bottone di colore rosso</Button>
        <Ellipse Fill="{MyColor}"/>
    </FlowPanel>
</Border>

To be continued...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese