Condividi tramite


Guida alla sintassi XAML

Vengono illustrate le regole di sintassi XAML e la terminologia che descrive le restrizioni o le scelte disponibili per la sintassi XAML. Questo argomento è utile se non si ha esperienza con l'uso del linguaggio XAML, si vuole un aggiornamento sulla terminologia o sulle parti della sintassi oppure si è curiosi di come funziona il linguaggio XAML e si vuole avere più background e 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. MA XAML ha anche concetti di sintassi specifici che estendono XML. Una determinata entità XML potrebbe essere valida in xml normale, ma tale sintassi potrebbe avere un significato diverso e più completo come XAML. Questo argomento illustra questi concetti relativi alla sintassi XAML.

Vocabolari XAML

Un'area in cui XAML differisce dalla maggior parte degli utilizzi XML è che XAML non viene in genere applicato con uno schema, ad esempio un file XSD. Questo perché XAML è progettato per essere estendibile, questo è il significato di "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 si basano su Windows Runtime. La documentazione dell'SDK a volte fa riferimento ai tipi già incorporati per Windows Runtime e può essere usata in XAML come vocabolario XAML per Windows Runtime. Microsoft Visual Studio consente di produrre markup validi all'interno di questo vocabolario XAML. Visual Studio può includere anche i tipi personalizzati per l'utilizzo di XAML, purché l'origine di tali tipi sia correttamente referenziata nel progetto. Per altre info su XAML e tipi personalizzati, vedi Spazi dei nomi XAML e mapping degli spazi dei nomi.

Dichiarazione di oggetti

I programmatori spesso pensano in termini di oggetti e membri, mentre un linguaggio di markup viene 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 backup. Per creare un oggetto runtime per la tua app, dichiari un elemento XAML nel markup XAML. L'oggetto viene creato quando Windows Runtime carica il codice 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, ad esempio una pagina, o l'oggetto grafico dell'intera definizione di runtime di un'applicazione.

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

  • Direttamente, usando la sintassi degli elementi oggetto: In questo modo vengono utilizzati tag di apertura e chiusura per creare un'istanza di un oggetto come elemento di formato XML. È possibile usare questa sintassi per dichiarare gli oggetti radice o per creare oggetti annidati che impostano i valori delle proprietà.
  • Indirettamente, usando la sintassi degli attributi: Viene usato 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 hai sempre la scelta di qualsiasi sintassi per la creazione di oggetti in un vocabolario XAML. Alcuni oggetti possono essere creati solo utilizzando la sintassi dell'elemento oggetto. Alcuni oggetti possono essere creati solo se inizialmente assegnati a un attributo. Infatti, gli oggetti che possono essere creati con la sintassi dell'elemento oggetto o dell'attributo sono relativamente rari nei vocabolari XAML. Anche se entrambe le forme di sintassi sono possibili, una delle sintassi sarà più comune come una questione di stile. Esistono anche tecniche che puoi usare in XAML per fare riferimento a oggetti esistenti anziché creare nuovi valori. Gli oggetti esistenti possono essere definiti in altre aree di XAML o 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 dell'elemento oggetto, scrivere tag come il seguente: <objectName> </objectName>, dove objectName è il nome del tipo per l'oggetto di cui si vuole creare un'istanza. Ecco l'utilizzo degli elementi 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 />

Containers

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 tramite la sintassi degli attributi

Poiché questo comportamento è associato all'impostazione della proprietà, verranno illustrate altre informazioni nelle sezioni future.

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 sintassi è denominata 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 determinate strutture.

Spesso si usa una sintassi dell'elemento oggetto con testo di inizializzazione se si desidera un valore di struttura con x:Key, in modo che possa esistere in un ResourceDictionary. Questa operazione può essere eseguita se si condivide tale 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.

In questo esempio abbreviato viene utilizzato il testo di inizializzazione per specificare i valori per uno Spessore, in questo caso specificando valori che impostano sia Left che Right su 20 e Sia Top che Bottom su 10. In questo esempio viene illustrato lo spessore creato come risorsa chiavata e quindi il riferimento a tale risorsa. Per ulteriori informazioni sul testo di inizializzazione di Spessore, consulta Spessore.

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

Annotazioni

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

Impostazione delle proprietà

È possibile impostare le proprietà sugli oggetti dichiarati usando la sintassi degli elementi oggetto. Esistono diversi modi per impostare le proprietà in XAML:

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

Come per la dichiarazione di 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à che dal tipo di oggetto utilizzato dalla proprietà. Nella guida di riferimento all'API di Windows Runtime vedrai gli utilizzi XAML che puoi usare nella sezione Sintassi . A volte esiste un utilizzo alternativo che funzionerebbe, ma sarebbe più dettagliato. Questi utilizzi verbosi non vengono sempre visualizzati perché stiamo cercando di mostrare le procedure consigliate o gli scenari reali per l'uso di tale proprietà in XAML. Le linee guida per la sintassi XAML sono disponibili nelle sezioni Utilizzo XAML delle pagine di riferimento per le proprietà che possono essere impostate in XAML.

Alcune proprietà sugli oggetti non possono essere impostate in XAML in alcun modo 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.

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

La sintassi della raccolta in XAML sembra che tu stia impostando 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 mezzo tipico con cui si imposta un valore di proprietà in un linguaggio di markup, ad esempio in XML o HTML. L'impostazione degli attributi XAML è simile alla modalità di impostazione dei valori degli attributi in XML. Il nome dell'attributo viene specificato in qualsiasi punto all'interno dei 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 stesso deve essere espresso come stringa. La stringa spesso contiene numeri, ma in XAML, tutti i valori degli attributi sono valori stringa fino a quando il parser XAML non viene coinvolto ed esegue una conversione di valore di base.

In questo esempio viene utilizzata 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 utilizzando la sintassi degli elementi proprietà. Un elemento della proprietà è simile alla seguente: <proprietà.dell'oggetto>.

Per usare la sintassi degli elementi proprietà, crei elementi di proprietà XAML per la proprietà che vuoi impostare. Nell'XML standard, questo elemento verrebbe considerato solo un elemento con un punto nel nome. In XAML, tuttavia, il punto nel nome dell'elemento identifica l'elemento come elemento proprietà, con la proprietà prevista come membro dell'oggetto in un'implementazione del modello a oggetti di backup. Per usare la sintassi degli elementi di proprietà, è necessario specificare un elemento oggetto per "riempire" i tag dell'elemento proprietà. Un elemento proprietà avrà sempre un certo contenuto (un singolo elemento, più elementi o del testo interno); non ha senso avere un elemento proprietà di chiusura automatica.

Nella grammatica seguente, la proprietà è il nome della proprietà che si desidera impostare e propertyValueAsObjectElement è un singolo elemento oggetto, previsto per soddisfare i requisiti del tipo di valore della proprietà.

< oggetto>

< oggetto.proprietà>

propertyValueAsObjectElement

</ oggetto.proprietà>

</ oggetto>

Nell'esempio seguente, la sintassi dell'elemento proprietà viene utilizzata per impostare il 'Fill' di un Rectangle con un elemento oggetto SolidColorBrush. All'interno di SolidColorBrush, Color viene impostato come attributo. Il risultato analizzato di questo codice 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. Si consideri questo esempio: <Button Background="Blue" .../>. La proprietà Background non è una proprietà dichiarata immediatamente nella classe Button . Invece, il parametro Background è ereditato dalla classe Control di base. Infatti, se si esamina l'argomento di riferimento relativo a Button , si noterà che gli elenchi di membri contengono almeno un membro ereditato da ogni catena di classi base successive: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject. Nell'elenco Proprietà tutte le proprietà di lettura/scrittura e le proprietà della raccolta vengono ereditate in un senso del vocabolario XAML. Anche gli eventi (come i vari eventi UIElement ) vengono ereditati.

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

Proprietà del 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, puoi omettere l'elemento della proprietà per tale proprietà quando lo specifichi 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 dell'oggetto del tipo proprietario. Le proprietà del contenuto XAML supportano una sintassi di markup semplice per tale proprietà e rendono il codice XAML più leggibile riducendo l'annidamento.

Se è disponibile una sintassi del contenuto XAML, tale sintassi verrà visualizzata nelle sezioni "XAML" della sintassi per tale proprietà nella documentazione di riferimento di Windows Runtime. Ad esempio, la pagina delle proprietà Child per Border mostra la sintassi del contenuto XAML anziché la sintassi dell'elemento proprietà per impostare il valore Border.Child a oggetto singolo di un oggetto Border, come illustrato di seguito:

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

Se la proprietà dichiarata come proprietà del contenuto XAML è il tipo Object o è di tipo String, la sintassi del contenuto XAML supporta il testo fondamentalmente interno nel modello di documento XML: una stringa tra i tag oggetto di apertura e chiusura. Ad esempio, la pagina delle proprietà Text per TextBlock mostra la sintassi del contenuto XAML con un valore di testo interno per impostare Text, ma la stringa "Text" non viene mai visualizzata 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 "Attributes". 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 vedrai questo: 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 interamente prima di qualsiasi elemento di proprietà oppure completamente dopo. Ad esempio, questo codice 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 della 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 della casella di testo, alcune etichette e forse un pulsante "Invia". Tuttavia, se si usa un modello a oggetti di programmazione per accedere a questi più elementi, in genere si tratta di elementi in una singola proprietà di raccolta, anziché di ogni elemento che rappresenta 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à della raccolta vengono identificate anche come proprietà del contenuto XAML per la classe . La combinazione dell'elaborazione implicita della raccolta e della sintassi del contenuto XAML è spesso utilizzata in tipi usati per comporre i controlli, come pannelli, visualizzazioni o controlli di elementi. Ad esempio, l'esempio seguente mostra il codice 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 della raccolta XAML

Potrebbe addirittura inizialmente apparire che XAML stia cercando di impostare una proprietà di una collezione di sola lettura. In realtà, ciò che XAML abilita qui consiste nell'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 appoggio 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 dell'insieme. 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: in particolare, il metodo Add nella maggior parte dei casi. Quando il processore XAML riscontra uno o più elementi oggetto all'interno di una sintassi di raccolta XAML, ogni oggetto è prima creato da un elemento, poi ogni nuovo oggetto viene aggiunto in sequenza alla raccolta contenente tramite la chiamata del 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. Molte tipologie di raccolta sono fortemente tipizzati dall'implementazione sottostante, il che significa che il parametro di input di Add prevede che qualsiasi elemento passato corrisponda al tipo del parametro Add.

Per le proprietà della raccolta, prestare 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, può generare un'eccezione di analisi XAML. È sufficiente usare la sintassi di raccolta implicita e non verrà visualizzata l'eccezione.

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

Tutte le proprietà che supportano l'impostazione 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 la sintassi e alcune proprietà supportano opzioni di sintassi aggiuntive, ad esempio una proprietà del 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 utilizzare la sintassi dell'attributo per impostare una proprietà se il tipo di oggetto utilizzato per impostare tale proprietà può essere creato elaborando una stringa. Per le primitive, questo è sempre il caso, la conversione del tipo viene compilata nel parser. Tuttavia, alcuni altri tipi di oggetto possono essere creati anche usando una stringa specificata come valore dell'attributo, anziché un elemento oggetto all'interno di un elemento property. Per il funzionamento di questa operazione, è necessario che sia presente una conversione del tipo sottostante, supportata da quella particolare proprietà o supportata in genere per tutti i valori che usano tale tipo di proprietà. Il valore stringa dell'attributo viene usato per impostare proprietà importanti per l'inizializzazione del nuovo valore dell'oggetto. Potenzialmente, un convertitore di tipi 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. Ad esempio, la sintassi XAML per Brush mostra come usare una sintassi di attributo per creare un nuovo valore SolidColorBrush per qualsiasi proprietà di tipo Brush (e in Windows Runtime XAML sono presenti molte proprietà Brush ).

Logica e regole di analisi XAML

In alcuni casi è informativo leggere il codice XAML in modo analogo a come un parser XAML deve leggerlo: come 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 mezzo tipico con cui si imposta un valore di proprietà in un linguaggio di markup, ad esempio in XML o HTML. Nella sintassi seguente objectName è l'oggetto di cui si vuole creare un'istanza, propertyName è il nome della proprietà che si desidera impostare su tale 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 impostare una proprietà su tale oggetto. Anche se il primo esempio è un singolo elemento nel markup, ci sono effettivamente passaggi discreti per quanto riguarda il 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 che tale istanza esiste può essere impostata su di essa la proprietà dell'istanza PropertyName .

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

Annotazioni

I progettisti XAML spesso promuovono le convenzioni di ordinamento se usi aree di progettazione diverse dall'editor XML, ma puoi modificare liberamente il codice XAML in un secondo momento, per riordinare gli attributi o introdurre nuovi elementi.

Proprietà associate

XAML estende XML aggiungendo un elemento di sintassi noto come proprietà associata. Analogamente alla sintassi dell'elemento proprietà, la sintassi della proprietà associata contiene un punto e il punto contiene 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 vengono impostate usando la sintassi AttachedPropertyProvider. PropertyName Ecco un esempio di come impostare la proprietà associata Canvas.Left in XAML:

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

È possibile impostare la proprietà associata sugli elementi che non dispongono di una proprietà di tale 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, ad esempio l'attributo xml:space .

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

Per altre info, vedi Panoramica delle proprietà associate.

Valori letterali "{"

Poiché il simbolo di parentesi graffa di apertura { segna l'inizio 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 le virgolette alternative (ad esempio, un ' all'interno di un valore di attributo delimitato da "") per fornire un valore "{" come stringa.

Annotazioni

"\}" 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. Puoi identificare quale valore di enumerazione usare come valore della proprietà utilizzando il nome non qualificato della costante. Ecco ad esempio come impostare UIElement.Visibility in XAML: <Button Visibility="Visible"/>. Qui la stringa "Visible" viene mappata direttamente a una costante denominata dell'enumerazione Visibility , Visible.

  • Non usare un modulo specifico, non funzionerà. Ad esempio, questo codice 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 modalità di definizione dell'enumerazione. Anche se potrebbe sembrare funzionante, si tratta di una procedura non valida 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"/>.

Annotazioni

Negli argomenti di riferimento per le API che usano XAML e usano enumerazioni, fare clic sul collegamento al tipo di enumerazione nella sezione Valore proprietà della Sintassi. Questo collegamento porta alla pagina di enumerazione dove è possibile scoprire le costanti denominate per quella enumerazione.

Le enumerazioni possono essere contrassegnate in modo tipo bandiera, ciò significa che sono attribuite con FlagsAttribute. Se è necessario specificare una combinazione di valori per un'enumerazione flagwise come valore dell'attributo XAML, utilizzare il nome di ciascuna costante di enumerazione, con una virgola (,) tra ogni nome e senza spazi aggiuntivi. Gli attributi flag per flag non sono comuni nel vocabolario XAML di Windows Runtime, ma ManipulationModes è un esempio in cui è supportata l'impostazione di un valore di enumerazione flag per flag in XAML.

Interfacce in XAML

In rari casi vedrai 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 disponibile per fungere da valore. Vedrai un'interfaccia usata come tipo nella sintassi XAML per le proprietà Command e CommandParameter di ButtonBase. Queste proprietà supportano modelli di progettazione MVVM (Model-View-ViewModel), in cui l'interfaccia ICommand è il contratto per il modo in cui interagiscono le visualizzazioni e i modelli.

Convenzioni segnaposto XAML nella documentazione di Windows Runtime

Se hai esaminato una delle sezioni Sintassi degli argomenti di riferimento per le API di Windows Runtime che possono usare XAML, probabilmente hai visto che la sintassi include alcuni segnaposto. La sintassi XAML è diversa dalla sintassi C#, Microsoft Visual Basic o Visual C++ (C++/CX) perché la sintassi XAML è una sintassi di utilizzo. È un suggerimento per l'utilizzo finale nei tuoi file XAML, ma senza essere eccessivamente prescrittivo sui valori che puoi 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 vengono visualizzati nomi di tipo/nomi di elementi in una sintassi XAML per una proprietà, il nome visualizzato è per il tipo che definisce originariamente la proprietà. Windows Runtime XAML supporta tuttavia un modello di ereditarietà delle classi per le classi basate su DependencyObject. È quindi possibile usare spesso un attributo in una classe che non è letteralmente la classe di definizione, ma deriva invece da una classe che ha definito prima la proprietà/attributo. Ad esempio, è possibile impostare Visibility come attributo in qualsiasi classe derivata uiElement usando un'ereditarietà profonda. Ad esempio: <Button Visibility="Visible" />. Non prendere quindi il nome dell'elemento in una sintassi di XAML in modo troppo letterale; la sintassi può 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 visualizzato come elemento di definizione sia in un utilizzo reale, tale nome di tipo viene deliberatamente abbassato nella sintassi. Ad esempio, la sintassi visualizzata per UIElement.Visibility è :

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

Molte sezioni della sintassi XAML includono segnaposto nella sezione "Utilizzo" che vengono quindi definiti in una sezione Valori XAML 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é li indovinerai o imparerai cosa rappresentano. Pensiamo che la maggior parte dei lettori si stancherebbe di vederli continuamente nei valori XAML, quindi li abbiamo omessi dalle definizioni. Per riferimento, ecco un elenco di alcuni di questi segnaposto e ciò che significano in generale:

  • oggetto: teoricamente qualsiasi valore dell'oggetto, ma spesso praticamente limitato a determinati tipi di oggetti, ad esempio una scelta di stringa o oggetto, ed è consigliabile controllare le osservazioni nella pagina di riferimento per ulteriori informazioni.
  • objectproprietà: oggettoproprietà in combinazione viene utilizzato per i casi in cui la sintassi visualizzata è la sintassi per un tipo che può essere utilizzato come valore di attributo per molte proprietà. Ad esempio, l'utilizzo degli attributi Xaml visualizzato per Brush include: <objectproperty="predefinedColorName"/>
  • eventhandler: viene visualizzato come valore dell'attributo per ogni sintassi XAML visualizzata per un attributo di evento. "Ciò che stai fornendo qui è il nome della funzione per un gestore eventi." 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 oppure il codice dell'app non verrà compilato. Ma questa è davvero una considerazione di programmazione, non una considerazione XAML, quindi non proviamo a suggerire nulla sul tipo delegato nella sintassi XAML. Per sapere quale delegate implementare per un evento, vedere la sezione Informazioni Evento dell'argomento di riferimento per l'evento, in una riga di tabella intitolata Delegate.
  • enumMemberName: illustrato nella sintassi degli attributi per tutte le enumerazioni. Esiste un segnaposto simile per le proprietà che utilizzano un valore di enumerazione, ma generalmente antepone al segnaposto un suggerimento del nome dell'enumerazione. Ad esempio, la sintassi illustrata per FrameworkElement.FlowDirection è <frameworkElementFlowDirection="flowDirectionMemberName"/>. Se ti trovi su una di quelle pagine di riferimento alle proprietà, fai clic sul collegamento al tipo di enumerazione visualizzato nella sezione Valore proprietà accanto al testo Tipo:. Per il valore dell'attributo di una proprietà che utilizza tale enumerazione, è possibile utilizzare qualsiasi stringa elencata nella colonna Membro dell'elenco Membri .
  • double, int, string, bool: si tratta di tipi primitivi noti al linguaggio XAML. Se si esegue la programmazione con C# o Visual Basic, questi tipi vengono proiettati in tipi equivalenti microsoft .NET, ad esempio Double, Int32, String e Boolean, ed è possibile usare tutti i membri di tali tipi .NET quando si usano i valori definiti da XAML nel code-behind .NET. Se si esegue la programmazione con C++/CX, si useranno i tipi primitivi C++, ma è anche possibile considerare questi equivalenti ai tipi definiti dallo spazio dei nomi Platform , ad esempio Platform::String. In alcuni casi saranno previste restrizioni aggiuntive relative ai valori per determinate proprietà. Ma in genere vedrai 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 che agli utilizzi XAML.

Suggerimenti e trucchi, note sullo stile

  • Le estensioni di markup in generale sono descritte nella panoramica principale di XAML. 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 nel permettere di suddividere il codice XAML in risorse riutilizzabili che provengono da un ResourceDictionary XAML. I modelli di controllo e gli stili correlati vengono quasi sempre definiti in un ResourceDictionary. Spesso definisci anche le parti più piccole di una definizione di modello di controllo o uno stile specifico dell'app in un oggetto ResourceDictionary , ad esempio un oggetto SolidColorBrush per un colore che l'app usa più volte per parti diverse dell'interfaccia utente. Usando un oggetto StaticResource, qualsiasi proprietà che altrimenti richiede l'utilizzo di un elemento di proprietà da impostare può ora essere impostata nella sintassi degli attributi. Tuttavia, i vantaggi del factoring xaml per il riutilizzo vanno oltre la semplice semplificazione della sintassi a livello di pagina. Per altre info, vedi Riferimenti alle risorse ResourceDictionary e XAML.
  • Verranno visualizzate diverse convenzioni per l'applicazione di spazi vuoti e feed di riga negli esempi XAML. In particolare, esistono convenzioni diverse per come suddividere gli elementi dell'oggetto con molti attributi diversi impostati. È solo una questione di stile. L'editor XML di Visual Studio applica alcune regole di stile predefinite quando modifichi XAML, ma puoi modificarle nelle impostazioni. Ci sono un numero ridotto di casi in cui lo spazio vuoto in un file XAML è considerato significativo; per altre info, vedi XAML e spazi vuoti.