Guida alla sintassi XAML

Vengono spiegate le regole di sintassi XAML e la terminologia che descrive le restrizioni o le scelte disponibile per la sintassi XAML. Questo argomento è utile se non si ha esperienza con l'uso del linguaggio XAML, si vuole essere aggiornati sulla terminologia o su parti della sintassi oppure si vuole scoprire come funziona il linguaggio XAML e avere più background e più contesto.

XAML è XML

Extensible Application Markup Language (XAML) ha una sintassi di base basata su XML e, per definizione, XAML valido deve essere XML valido. XAML, tuttavia, ha concetti di sintassi propri che estendono XML. Una determinata entità XML potrebbe essere valida in XML normale, ma questa sintassi potrebbe avere un significato diverso e più completo come XAML. Questo argomento illustra questi concetti di sintassi XAML.

Vocabolari XAML

Un'area in cui XAML si differenzia dalla maggior parte degli utilizzi XML nel fatto che XAML non viene in genere applicato con uno schema, ad esempio un file XSD. Questo perché XAML è progettato per essere estendibile, che è ciò che significa "X" nell'acronimo XAML. Dopo l'analisi di XAML, gli elementi e gli attributi a cui si fa riferimento in XAML dovrebbero esistere in una rappresentazione di codice di supporto, nei tipi di base definiti da Windows Runtime o in tipi che estendono o sono basati su Windows Runtime. La documentazione dell'SDK a volte fa riferimento ai tipi già predefiniti in Windows Runtime e può essere usata in XAML come vocabolario XAML per Windows Runtime. Microsoft Visual Studio consente di produrre markup valido all'interno di questo vocabolario XAML. Visual Studio può includere anche i tipi personalizzati per l'utilizzo di XAML, purché all'origine di questi tipi si faccia riferimento correttamente nel progetto. Per altre informazioni su XAML e sui tipi personalizzati, vedere Mapping degli spazi dei nomi e degli spazi dei nomi XAML.

Dichiarazione di oggetti

I programmatori pensano spesso in termini di oggetti e membri, mentre un linguaggio di markup è concettualizzato come elementi e attributi. Nel senso più semplice, un elemento dichiarato nel markup XAML diventa un oggetto in una rappresentazione dell'oggetto runtime di supporto. Per creare un oggetto runtime per l'app, dichiarare un elemento XAML nel markup XAML. L'oggetto viene creato quando Windows Runtime carica XAML.

Un file XAML ha sempre esattamente un elemento che funge da radice, che dichiara un oggetto che sarà la radice concettuale di una struttura di programmazione come una pagina o un grafico di oggetti dell'intera definizione di runtime di un'applicazione.

In termini di sintassi XAML, sono disponibili tre modi per dichiarare oggetti in XAML:

  • Direttamente, usando la sintassi degli elementi oggetto: usa tag di apertura e chiusura per creare un'istanza di un oggetto come elemento XML-form. È possibile usare questa sintassi per dichiarare oggetti radice o creare oggetti annidati che impostano i valori delle proprietà.
  • Indirettamente, usando la sintassi degli attributi: usa un valore stringa inline che contiene istruzioni per la creazione di un oggetto. Il parser XAML usa questa stringa per impostare il valore di una proprietà su un valore di riferimento appena creato. Il supporto è limitato a determinati oggetti e proprietà comuni.
  • Uso di un'estensione di markup.

Questo non significa che è sempre possibile scegliere qualsiasi sintassi per la creazione di oggetti in un vocabolario XAML. Alcuni oggetti possono essere creati solo usando la sintassi degli elementi oggetto. Alcuni oggetti possono essere creati solo impostandoli inizialmente in un attributo. Di fatto, gli oggetti che è possibile creare con la sintassi degli elementi oggetto o degli attributi sono relativamente rari nei vocabolari XAML. Anche se entrambe le forme di sintassi sono possibili, una delle sintassi sarà più comune per una questione di stile. Esistono anche tecniche che è possibile usare in XAML per fare riferimento a oggetti esistenti anziché creare nuovi valori. Gli oggetti esistenti possono essere definiti in altre aree di XAML oppure possono esistere in modo implicito tramite un comportamento della piattaforma e dei relativi modelli di applicazione o programmazione.

Dichiarazione di un oggetto tramite la sintassi degli elementi oggetto

Per dichiarare un oggetto con sintassi degli elementi oggetto, scrivere tag come il seguente: <objectName> </objectName>, dove objectName è il nome del tipo per l'oggetto di cui si vuole creare un'istanza. Di seguito è riportato l'utilizzo di un elemento oggetto per dichiarare un oggetto Canvas:

<Canvas>
</Canvas>

Se l'oggetto non contiene altri oggetti, è possibile dichiarare l'elemento oggetto usando un tag di chiusura automatica anziché una coppia di apertura/chiusura: <Canvas />

Contenitori

Molti oggetti usati come elementi dell'interfaccia utente, ad esempio Canvas, possono contenere altri oggetti. Questi vengono talvolta definiti contenitori. L'esempio seguente mostra un contenitore Canvas che contiene un elemento, un Rectangle.

<Canvas>
  <Rectangle />
</Canvas>

Dichiarazione di un oggetto usando la sintassi degli attributi

Poiché questo comportamento è associato all'impostazione della proprietà, verrà approfondito nelle sezioni successive.

Testo di inizializzazione

Per alcuni oggetti è possibile dichiarare nuovi valori usando il testo interno usato come valori di inizializzazione per la costruzione. In XAML questa tecnica e la sintassi sono definite testo di inizializzazione. Concettualmente, il testo di inizializzazione è simile alla chiamata di un costruttore con parametri. Il testo di inizializzazione è utile per impostare i valori iniziali di alcune strutture.

Spesso si usa la sintassi degli elementi oggetto con testo di inizializzazione se si vuole un valore di struttura con x:Key, pertanto può esistere in un elemento ResourceDictionary. Questa operazione può essere eseguita se si condivide questo valore di struttura tra più proprietà di destinazione. Per alcune strutture, non è possibile usare la sintassi degli attributi per impostare i valori della struttura: il testo di inizializzazione è l'unico modo per produrre una risorsa CornerRadius, Thickness, GridLength o Color utile e condivisibile.

Questo breve esempio usa il testo di inizializzazione per specificare valori per un elemento Thickness, in questo caso specificando valori che impostano Left e Right su 20 e Top e Bottom su 10. Questo esempio mostra l'elemento Thickness creato come risorsa con chiave, quindi il riferimento a tale risorsa. Per altre informazioni sul testo di inizializzazione Thickness, vedere Thickness.

<UserControl ...>
  <UserControl.Resources>
    <Thickness x:Key="TwentyTenThickness">20,10</Thickness>
    ....
  </UserControl.Resources>
  ...
  <Grid Margin="{StaticResource TwentyTenThickness}">
  ...
  </Grid>
</UserControl ...>

Nota Alcune strutture non possono essere dichiarate come elementi oggetto. Il testo di inizializzazione non è supportato e non può essere usato come risorse. Per impostare proprietà su questi valori in XAML, è necessario usare una sintassi degli attributi. Questi tipi sono: Duration, RepeatBehavior, Point, Rect e Size.

Impostazione delle proprietà

È possibile impostare proprietà su oggetti dichiarati usando la sintassi degli elementi oggetto. Sono disponibili diversi modi per impostare proprietà in XAML:

  • Usando la sintassi degli attributi.
  • Usando la sintassi degli elementi di proprietà.
  • Usando la sintassi degli elementi in cui il contenuto (testo interno o elementi figlio) imposta la proprietà del contenuto XAML di un oggetto.
  • Usando una sintassi di raccolta, in genere la sintassi di raccolta implicita.

Come con la dichiarazione dell'oggetto, questo elenco non implica che qualsiasi proprietà possa essere impostata con ognuna delle tecniche. Alcune proprietà supportano solo una delle tecniche. Alcune proprietà supportano più di un modulo. Ad esempio, esistono proprietà che possono usare la sintassi degli elementi di proprietà o la sintassi degli attributi. Ciò che è possibile dipende sia dalla proprietà sia dal tipo di oggetto usato dalla proprietà. Nel riferimento all'API Windows Runtime, si vedono gli utilizzi XAML possibili nella sezione Sintassi. Talvolta, è possibile un utilizzo alternativo fattibile, ma più dettagliato. Questi utilizzi dettagliati non vengono sempre visualizzati perché si sta cercando di mostrare le procedure consigliate o scenari reali per l'uso di tale proprietà in XAML. Le linee guida per la sintassi XAML vengono fornite nelle sezioni Utilizzo di XAML delle pagine di riferimento per le proprietà che è possibile impostare in XAML.

Alcune proprietà sugli oggetti non possono essere impostate in XAML e possono essere impostate solo usando il codice. In genere si tratta di proprietà più appropriate per l'uso nel code-behind, non in XAML.

Non è possibile impostare una proprietà di sola lettura in XAML. Anche nel codice, il tipo proprietario deve supportare qualche altro modo per impostarlo, ad esempio un overload del costruttore, un metodo helper o un supporto delle proprietà calcolate. Una proprietà calcolata si basa sui valori di altre proprietà impostabili più talvolta un evento con gestione predefinita; queste funzionalità sono disponibili nel sistema di proprietà di dipendenza. Per altre informazioni su come le proprietà di dipendenza sono utili per il supporto delle proprietà calcolate, vedere Panoramica delle proprietà di dipendenza.

La sintassi della raccolta in XAML dà l'impressione di impostare una proprietà di sola lettura, ma in realtà non è così. Vedere "Sintassi della raccolta" più avanti in questo argomento.

Impostazione di una proprietà tramite la sintassi degli attributi

L'impostazione di un valore di attributo è il modo tipico con cui si imposta un valore di proprietà in un linguaggio di markup, ad esempio XML o HTML. L'impostazione degli attributi XAML è simile all'impostazione di valori di attributo in XML. Il nome dell'attributo viene specificato in qualsiasi punto all'interno di tag che seguono il nome dell'elemento, separato dal nome dell'elemento da almeno uno spazio vuoto. Il nome dell'attributo è seguito da un segno di uguale. Il valore dell'attributo è contenuto all'interno di una coppia di virgolette. Le virgolette possono essere virgolette doppie o virgolette singole purché corrispondano e racchiudano il valore. Il valore dell'attributo deve poter essere espresso come stringa. La stringa spesso contiene numeri, ma in XAML, tutti i valori degli attributi sono valori stringa finché il parser XAML non viene coinvolto e non esegue una conversione del valore di base.

Questo esempio usa la sintassi degli attributi per quattro attributi per impostare le proprietà Name, Width, Height e Fill di un oggetto Rectangle.

<Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue" />

Impostazione di una proprietà tramite la sintassi degli elementi di proprietà

È possibile impostare molte proprietà di un oggetto usando la sintassi degli elementi proprietà. Un elemento proprietà è simile a: <object.property>.

Per usare la sintassi degli elementi proprietà, si creano elementi di proprietà XAML per la proprietà che si desidera impostare. Nell linguaggio XML standard, questo elemento verrebbe considerato un elemento con un punto nel nome. Tuttavia, in XAML, il punto nel nome dell'elemento identifica l'elemento come elemento di proprietà, con la proprietà che si prevede sarà un membro dell'oggetto nell'implementazione di un modello a oggetti di supporto. Per usare la sintassi degli elementi di proprietà, deve essere possibile specificare un elemento oggetto per "riempire" i tag dell'elemento proprietà. Un elemento proprietà avrà sempre del contenuto (singolo elemento, più elementi o testo interno). Non vi è motivo di avere un elemento proprietà a chiusura automatica.

Nella grammatica seguente, proprietà è il nome della proprietà che si vuole impostare e propertyValueAsObjectElement un singolo elemento oggetto, che si prevede dovrà soddisfare i requisiti del tipo di valore della proprietà.

<object>

<object.property>

propertyValueAsObjectElement

</object.property>

</object>

L'esempio seguente usa la sintassi degli elementi di proprietà per impostare la proprietà Fill di un oggetto Rectangle con un elemento oggetto SolidColorBrush. (All'interno di SolidColorBrush, Color è impostato come un attributo.) Il risultato analizzato di questo XAML è identico all'esempio XAML precedente che imposta Fill usando la sintassi degli attributi.

<Rectangle
  Name="rectangle1"
  Width="100" 
  Height="100"
> 
  <Rectangle.Fill> 
    <SolidColorBrush Color="Blue"/> 
  </Rectangle.Fill>
</Rectangle>

Vocabolari XAML e programmazione orientata agli oggetti

Le proprietà e gli eventi visualizzati come membri XAML di un tipo XAML di Windows Runtime vengono spesso ereditati dai tipi di base. Considerare questo esempio: <Button Background="Blue" .../>. La proprietà Background non è una proprietà immediatamente dichiarata nella classe Button. Background è ereditato dalla classe base Control. Di fatto, se si consulta l'argomento di riferimento per Button si vedrà che gli elenchi dei membri contengono almeno un membro ereditato da ognuna di una catena di classi base successive: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject. Nell'elenco Proprietà tutte le proprietà di lettura/scrittura e le proprietà della raccolta sono ereditate come vocabolario XAML. Anche gli eventi (come i vari elementi UIElement) sono ereditati.

Se si usa il riferimento a Windows Runtime per le linee guida XAML, il nome dell'elemento mostrato in una sintassi o anche nel codice di esempio è talvolta destinato al tipo che definisce originariamente la proprietà, perché tale argomento di riferimento è condiviso da tutti i tipi possibili che lo ereditano da una classe base. Se si usa IntelliSense di Visual Studio per XAML nell'editor XML, IntelliSense e i relativi elenchi a discesa eseguono un ottimo lavoro per la coalescenza dell'ereditarietà e per fornire un elenco accurato di attributi disponibili per l'impostazione dopo aver iniziato a usare un elemento oggetto per un'istanza della classe.

Proprietà di contenuto XAML

Alcuni tipi definiscono una delle relative proprietà in modo che la proprietà consenta una sintassi del contenuto XAML. Per la proprietà del contenuto XAML di un tipo, è possibile omettere l'elemento per quella proprietà quando lo si specifica in XAML. In alternativa, è possibile impostare la proprietà su un valore di testo interno specificando il testo interno direttamente all'interno dei tag degli elementi oggetto del tipo proprietario. Le proprietà del contenuto XAML supportano una sintassi di markup semplice per la proprietà e rendono il codice XAML più leggibile riducendo l'annidamento.

Se è disponibile una sintassi del contenuto XAML, quella sintassi verrà mostrata nelle sezioni "XAML" di Sintassi per quella proprietà nella documentazione di riferimento di Windows Runtime. Ad esempio, la pagina della proprietà Child per Border mostra la sintassi del contenuto XAML anziché la sintassi degli elementi di proprietà per impostare il valore Border.Child per singolo oggetto di un elemento Border, come il seguente:

<Border>
  <Button .../>
</Border>

Se la proprietà dichiarata come proprietà del contenuto XAML è il tipo Object o il tipo String, la sintassi del contenuto XAML supporta il testo interno nel modello di documento XML: una stringa tra i tag oggetto di apertura e chiusura. Ad esempio, la pagina della proprietà Text per TextBlock mostra la sintassi del contenuto XAML con valore testo interno per impostare Text, ma la stringa "Text" non appare mai nel markup. Di seguito è riportato un esempio di utilizzo:

<TextBlock>Hello!</TextBlock>

Se esiste una proprietà del contenuto XAML per una classe, questa è indicata nell'argomento di riferimento per la classe , nella sezione "Attributi". Cercare il valore di ContentPropertyAttribute. Questo attributo usa un campo denominato "Name". Il valore di "Name" è il nome della proprietà della classe che è la proprietà del contenuto XAML. Ad esempio, nella pagina di riferimento Border, si vedrà: ContentProperty("Name=Child").

Una regola di sintassi XAML importante da ricordare è che non è possibile combinare la proprietà del contenuto XAML e altri elementi di proprietà impostati sull'elemento. La proprietà del contenuto XAML deve essere impostata completamente prima di qualsiasi elemento della proprietà o completamente dopo. Ad esempio, questo è uno XAML non valido:

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

Sintassi di raccolta

Tutte le sintassi mostrate finora impostano proprietà su singoli oggetti. Tuttavia, molti scenari dell'interfaccia utente richiedono che un determinato elemento padre possa avere più elementi figlio. Ad esempio, un'interfaccia utente per un modulo di input richiede diversi elementi casella di testo, alcune etichette e probabilmente un pulsante "Invia". Tuttavia, se si usasse un modello a oggetti di programmazione per accedere a questi molteplici elementi, si avrebbero elementi in una singola proprietà di raccolta, anziché singoli elementi a rappresentare il valore di proprietà diverse. XAML supporta più elementi figlio e supporta un tipico modello di raccolta di supporto trattando le proprietà che usano un tipo di raccolta come implicito ed eseguendo una gestione speciale per qualsiasi elemento figlio di un tipo di raccolta.

Molte proprietà di raccolta vengono identificate anche come proprietà del contenuto XAML per la classe. La combinazione di sintassi di contenuto XAML ed elaborazione di raccolta implicita si riscontra di frequente in tipi usati per comporre controlli come pannelli, visualizzazioni o controlli elementi. Ad esempio, l'esempio seguente mostra uno XAML più semplice possibile per la composizione di due elementi dell'interfaccia utente peer all'interno di StackPanel.

<StackPanel>
  <TextBlock>Hello</TextBlock>
  <TextBlock>World</TextBlock>
</StackPanel>

Meccanismo della sintassi di raccolta XAML

Potrebbe apparire inizialmente che XAML abilita un "set" della proprietà di raccolta di sola lettura. In realtà, qui XAML consente di aggiungere elementi a una raccolta esistente. Il linguaggio XAML e i processori XAML che implementano il supporto XAML si basano su una convenzione nei tipi di raccolta di supporto per abilitare questa sintassi. In genere è presente una proprietà di backup, ad esempio un indicizzatore o una proprietà Items che fa riferimento a elementi specifici della raccolta. In genere, tale proprietà non è esplicita nella sintassi XAML. Per le raccolte, il meccanismo sottostante per l'analisi XAML non è una proprietà, ma un metodo: nello specifico, il metodo Add nella maggior parte dei casi. Quando il processore XAML rileva uno o più elementi oggetti nella sintassi della raccolta XAML, ognuno di questi oggetti viene prima creato da un elemento, quindi ogni nuovo oggetto viene aggiunto in ordine nella raccolta contenitore chiamando il metodo Add della raccolta.

Quando un parser XAML aggiunge elementi a una raccolta, è la logica del metodo Add che determina se un determinato elemento XAML è un elemento figlio consentito dell'oggetto raccolta. Molti tipi di raccolta sono fortemente tipizzati dall'implementazione di supporto, il che significa che il parametro di input di Add prevede che qualsiasi elemento passato debba essere una corrispondenza di tipo con il tipo di parametro Add.

Per le proprietà della raccolta, fare attenzione quando si tenta di specificare la raccolta in modo esplicito come elemento oggetto. Un parser XAML creerà un nuovo oggetto ogni volta che rileva un elemento oggetto. Se la proprietà della raccolta che si sta tentando di usare è di sola lettura, si può generare un'eccezione di analisi XAML. È sufficiente usare la sintassi di raccolta implicita per evitare che venga generata l'eccezione.

Quando usare la sintassi degli attributi o degli elementi di proprietà

Tutte le proprietà che possono essere impostate in XAML supporteranno la sintassi degli attributi o degli elementi di proprietà per l'impostazione diretta del valore, ma potenzialmente non supporterà la sintassi in modo intercambiabile. Alcune proprietà supportano una o l'altra sintassi e alcune proprietà supportano opzioni di sintassi aggiuntive, ad esempio una proprietà di contenuto XAML. Il tipo di sintassi XAML supportato da una proprietà dipende dal tipo di oggetto usato dalla proprietà come tipo di proprietà. Se il tipo di proprietà è un tipo primitivo, ad esempio un valore double (float o decimal), integer, Boolean o string, la proprietà supporta sempre la sintassi degli attributi.

È anche possibile usare la sintassi degli attributi per impostare una proprietà se il tipo di oggetto usato per impostare tale proprietà può essere creato elaborando una stringa. Per le primitive, questo è sempre il caso, la conversione del tipo è integrata nel parser. Tuttavia, alcuni altri tipi di oggetto possono essere creati usando una stringa specificata come valore dell'attributo, anziché un elemento oggetto all'interno di un elemento proprietà. Affinché questo funzioni, la conversione del tipo sottostante deve essere possibile, supportata da quella particolare proprietà o in genere per tutti i valori che usano quel tipo di proprietà. Il valore stringa dell'attributo viene usato per impostare proprietà importanti per l'inizializzazione del nuovo valore oggetto. Potenzialmente, un convertitore di tipo specifico può anche creare sottoclassi diverse di un tipo di proprietà comune, a seconda del modo in cui elabora in modo univoco le informazioni nella stringa. I tipi di oggetto che supportano questo comportamento avranno una grammatica speciale elencata nella sezione della sintassi della documentazione di riferimento. Come esempio, la sintassi XAML per Brush mostra come la sintassi di un attributo può essere usata per creare un nuovo valore SolidColorBrush per qualsiasi proprietà di tipo Brush (sono presenti molte proprietà Brush in XAML di Windows Runtime).

Regole e logica di analisi XAML

In alcuni casi è istruttivo leggere XAML in modo analogo a come deve leggerlo un parser XAML, ovvero come un set di token stringa rilevati in un ordine lineare. Un parser XAML deve interpretare questi token in un set di regole che fanno parte della definizione del funzionamento di XAML.

L'impostazione di un valore di attributo è il modo tipico con cui si imposta un valore di proprietà in un linguaggio di markup, ad esempio XML o HTML. Nella sintassi seguente objectName è l'oggetto di cui si desidera creare un'stanza, propertyName è il nome della proprietà che si vuole impostare su quell'oggetto e propertyValue è il valore da impostare.

<objectName propertyName="propertyValue" .../>

-or-

<objectName propertyName="propertyValue">

...<!--element children -->

</objectName>

Entrambe le sintassi consentono di dichiarare un oggetto e di impostare una proprietà su di esso. Anche se il primo esempio è un singolo elemento nel markup, sono effettivamente presenti passaggi discreti relativamente al modo in cui un processore XAML analizza questo markup.

Prima di tutto, la presenza dell'elemento oggetto indica che è necessario creare un'istanza di un nuovo oggetto objectName. Solo dopo aver creato questa istanza, è possibile impostare su di essa la proprietà istanza propertyName.

Un'altra regola di XAML prevede che gli attributi di un elemento debbano essere impostati in qualsiasi ordine. Ad esempio, non esiste differenza tra <Rectangle Height="50" Width="100" /> e <Rectangle Width="100" Height="50" />. L'ordine che si decide di usare è solo una questione di stile.

Nota Le finestre di progettazione XAML spesso promuovono convenzioni di ordinazione se si usano aree di progettazione diverse dall'editor XML, tuttavia è possibile modificare liberamente XAML in seguito per riordinare gli attributi o introdurne di nuovi.

Proprietà associate

XAML estende XML aggiungendo un elemento di sintassi noto come proprietà associata. Analogamente alla sintassi degli elementi di proprietà, la sintassi della proprietà associata contiene un punto e il punto ha un significato speciale per l'analisi XAML. In particolare, il punto separa il provider della proprietà associata e il nome della proprietà.

In XAML le proprietà associate si impostano usando la sintassi AttachedPropertyProvider.PropertyName Di seguito è riportato un esempio del modo in cui è possibile impostare la proprietà associata Canvas.Left in XAML:

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

È possibile impostare la proprietà associata su elementi che non dispongono di una proprietà con quel nome nel tipo di supporto e in questo modo funzionano in modo simile a una proprietà globale o a un attributo definito da uno spazio dei nomi XML diverso, come l'attributo xml:space.

In XAML di Windows Runtime si vedono le proprietà associate che supportano questi scenari:

Per altre informazioni, vedere Panoramica delle proprietà associate.

Valori "{" letterali

Poiché il simbolo di parentesi graffa di apertura { è l'apertura della sequenza di estensione di markup, si usa una sequenza di escape per specificare un valore stringa letterale che inizia con "{". La sequenza di escape è "{}". Ad esempio, per specificare un valore stringa costituito da una singola parentesi graffa di apertura, specificare il valore dell'attributo come "{}{". È anche possibile usare virgolette alternative (ad esempio, un ' all'interno di un valore di attributo delimitato da "") per fornire un valore "{" come stringa.

Nota "\}" funziona anche se si trova all'interno di un attributo tra virgolette.  

Valori di enumerazione

Molte proprietà nell'API di Windows Runtime usano enumerazioni come valori. Se il membro è una proprietà di lettura/scrittura, è possibile impostare tale proprietà specificando un valore di attributo. Identificare il valore di enumerazione da usare come valore della proprietà usando il nome non completo della costante. Di seguito è riportato un esempio di come impostare UIElement.Visibility in XAML: <Button Visibility="Visible"/>. Qui "Visible" come stringa è direttamente mappato a una costante denominata dell'enumerazione Visibility, Visible.

  • Non usare un form completo, non funzionerà. Ad esempio, questo è uno XAML non valido: <Button Visibility="Visibility.Visible"/>.
  • Non usare il valore della costante. In altre parole, non basarsi sul valore intero dell'enumerazione presente in modo esplicito o implicito a seconda della definizione dell'enumerazione. Anche se all'apparenza potrebbe funzionante, non è una procedura consigliata in XAML o nel codice perché ci si basa su ciò che potrebbe essere un dettaglio di implementazione temporaneo. Ad esempio, non eseguire questa operazione: <Button Visibility="1"/>.

Nota Negli argomenti di riferimento delle API che usano XAML ed enumerazioni, fare clic sul collegamento al tipo di enumerazione nella sezione Valore proprietà di Sintassi. Questo è un collegamento alla pagina enumerazione in cui è possibile scoprire le costanti denominate per tale enumerazione.

Le enumerazioni possono essere basate su flag, vale a dire attribuite con FlagsAttribute. Se è necessario specificare una combinazione di valori per un'enumerazione basata su flag come valore di attributo XAML, usare il nome di ogni costante di enumerazione, con una virgola (,) tra ogni nome e senza spazi intermedi. Gli attributi basati su flag non sono comuni nel vocabolario XAML di Windows Runtime, ma ManipulationModes è un esempio in cui è possibile impostare un valore di enumerazione basato su flag in XAML.

Interfacce in XAML

In rari casi si vedrà una sintassi XAML in cui il tipo di una proprietà è un'interfaccia. Nel sistema di tipi XAML, un tipo che implementa tale interfaccia è accettabile come valore durante l'analisi. Deve essere presente un'istanza creata di tale tipo che funga da valore. Si vedrà un'interfaccia usata come tipo nella sintassi XAML per le proprietà Command e CommandParameter di ButtonBase. Queste proprietà supportano modelli di progettazione Model-View-ViewModel (MVVM) in cui l'interfaccia ICommand è il contratto in base al quale avviene l'interazione tra le visualizzazioni e i modelli.

Convenzioni segnaposto XAML nel riferimento a Windows Runtime

Se si è esaminata la sezione Sintassi degli argomenti di riferimento per le API Windows Runtime che possono usare XAML, probabilmente si è visto che la sintassi include alcuni segnaposto. La sintassi XAML è diversa dalla sintassi di C#, Microsoft Visual Basic o Estensioni componenti Visual C++ (C++/CX) perché la sintassi XAML è una sintassi di utilizzo. È un suggerimento all'utilizzo finale nei file XAML, ma senza essere eccessivamente prescrittivo sui valori che è possibile usare. Di solito l'utilizzo descrive un tipo di grammatica che combina valori letterali e segnaposto e definisce alcuni dei segnaposto nella sezione Valori XAML.

Quando si vedono nomi di tipo/nomi di elementi in una sintassi XAML per una proprietà, il nome mostrato è per il tipo che definisce originariamente la proprietà. XAML di Windows Runtime, tuttavia, supporta un modello di ereditarietà delle classi per le classi basate su DependencyObject. Pertanto, è possibile usare spesso un attributo su una classe che non è letteralmente la classe di definizione, ma che deriva invece da una classe che ha definito per prima la proprietà/attributo. Ad esempio, è possibile impostare Visibility come attributo su qualsiasi classe derivata UIElement usando un'ereditarietà profonda. Ad esempio: <Button Visibility="Visible" />. Non accettare il nome dell'elemento mostrato in una sintassi di utilizzo XAML troppo letterale. La sintassi potrebbe essere valida per gli elementi che rappresentano quella classe e anche per gli elementi che rappresentano una classe derivata. Nei casi in cui è raro o impossibile che il tipo mostrato come elemento di definizione sia impiegato in un utilizzo reale, quel nome di tipo viene deliberatamente scritto in minuscolo nella sintassi. Ad esempio, la sintassi visualizzata per UIElement.Visibility è:

<uiElement Visibility="Visible"/>
-or-
<uiElement Visibility="Collapsed"/>

Molte sezioni di sintassi XAML includono segnaposto nella sezione "Utilizzo" che vengono quindi definiti in una sezione Valori XAML che si trova direttamente sotto la sezione Sintassi.

Le sezioni di utilizzo XAML usano anche vari segnaposto generalizzati. Questi segnaposto non vengono ridefiniti ogni volta in Valori XAML, perché si presumerà o si apprenderà cosa rappresentano. Si pensa che la maggior parte dei lettori si stanchi di continuare a rivederli in Valori XAML, quindi sono stati omessi dalle definizioni. Per riferimento, ecco un elenco di alcuni di questi segnaposto e di ciò che significano in generale:

  • object: in teoria qualsiasi valore oggetto, ma spesso in pratica limitato ad alcuni tipi di oggetti come scelta tra stringa o oggetto, pertanto è consigliabile vedere le Osservazioni nella pagina di riferimento per ottenere informazioni.
  • objectproperty: objectproperty in combinazione viene usato nei casi in cui la sintassi mostrata è la sintassi per un tipo che è possibile usare come valore di attributo per molte proprietà. Ad esempio, l'utilizzo di attributi Xaml mostrato perBrush include: <objectproperty="predefinedColorName"/>
  • eventhandler: viene visualizzato come valore di attributo per ogni sintassi XAML mostra per un attributo di evento. Di seguito è riportato il nome della funzione per una funzione del gestore dell'evento. Tale funzione deve essere definita nel code-behind per la pagina XAML. A livello di programmazione, tale funzione deve corrispondere alla firma del delegato dell'evento che si sta gestendo, altrimenti il codice dell'app non verrà compilato. Ma questa è davvero una considerazione di programmazione, non una considerazione XAML, quindi non è intenzione suggerire nulla sul tipo delegato nella sintassi XAML. Per sapere quale delegato implementare per un evento, vedere la sezione Informazioni sull'evento nell'argomento di riferimento per l'evento, in una riga di tabella con etichetta Delegate.
  • enumMemberName: illustrato nella sintassi degli attributi per tutte le enumerazioni. Esiste un segnaposto simile per le proprietà che usano un valore di enumerazione, ma in genere antepone al segnaposto un hint del nome dell'enumerazione. Ad esempio, la sintassi mostrata per FrameworkElement.FlowDirection è <frameworkElementFlowDirection="flowDirectionMemberName"/>. Se si è su una di queste pagine di riferimento alle proprietà, fare clic sul collegamento al tipo di enumerazione visualizzato nella sezione Valore proprietà accanto al testo Type:. Per il valore dell'attributo di una proprietà che usare tale enumerazione, è possibile usare qualsiasi stringa elencata nella colonna Member dell'elenco Members.
  • double, int, string, bool: si tratta di tipi primitivi noti al linguaggio XAML. Se si programma usando C# o Visual Basic, questi tipi vengono proiettati in tipi equivalenti di Microsoft .NET quali Double, Int32, String e Boolean, ed è possibile usare qualsiasi membro su questi tipi .NET quando si usano valori definiti da XAML nel code-behind .NET. Se si programma usando C++/CX, si useranno i tipi primitivi C++ anche se è possibile considerare questi equivalenti ai tipi definiti dallo spazio dei nomi Platform, ad esempio Platform::String. In alcuni casi saranno previste restrizioni aggiuntive per determinate proprietà. In genere si vedono questi elementi annotati in una sezione Valore proprietà o Osservazioni e non in una sezione XAML, perché tali restrizioni si applicano sia agli utilizzi del codice sia agli utilizzi di XAML.

Consigli e suggerimenti, note sullo stile

  • Le estensioni di markup in generale sono descritte nella Panoramica di XAML principale. Tuttavia, l'estensione di markup che influisce maggiormente sulle indicazioni fornite in questo argomento è l'estensione di markup StaticResource (e themeResource correlato). La funzione dell'estensione di markup StaticResource consiste nell'abilitare il factoring di XAML in risorse riutilizzabili provenienti da un oggetto ResourceDictionary XAML. Si definiscono quasi sempre i modelli di controllo e gli stili correlati in un elemento ResourceDictionary. Spesso si definiscono le parti più piccole di una definizione di modello di controllo o di uno stile specifico dell'app in un elemento ResourceDictionary, ad esempio SolidColorBrush per un colore che l'app usa più di una volta per parti diverse dell'interfaccia utente. Usando un oggetto StaticResource, qualsiasi proprietà che altrimenti richiederebbe l'utilizzo di un elemento di proprietà da impostare può ora essere impostata nella sintassi degli attributi. Tuttavia, i vantaggi del factoring di XAML per il riutilizzo vanno oltre la semplificazione della sintassi a livello di pagina. Per altre informazioni, vedere Riferimenti a ResourceDictionary e risorse XAML.
  • Si vedranno diverse convenzioni per l'applicazione di spazi vuoti e avanzamenti riga negli esempi di XAML. In particolare, esistono convenzioni diverse per il modo di suddividere gli elementi oggetto con molti attributi diversi impostati. È solo una questione di stile. L'editor XML di Visual Studio applica alcune regole di stile predefinite quando si modifica XAML, tuttavia è possibile modificarle nelle impostazioni. Ci sono un numero ridotto di casi in cui lo spazio vuoto in un file XAML è considerato significativo; per altre informazioni, vedere XAML e spazi vuoti.