Informazioni su strutture e concetti del flusso del nodo XAMLUnderstanding XAML Node Stream Structures and Concepts

I reader XAML e i writer XAML implementati nei servizi XAML di .NET Framework sono basati sul concetto di progettazione di un flusso di nodi XAML.XAML readers and XAML writers as implemented in .NET Framework XAML Services are based on the design concept of a XAML node stream. Il flusso di nodi XAML è una concettualizzazione di un set di nodi XAML.The XAML node stream is a conceptualization of a set of XAML nodes. In questa concettualizzazione, un processore XAML attraversa la struttura delle relazioni tra i nodi in XAML, una alla volta.In this conceptualization, a XAML processor walks through the structure of the node relationships in the XAML one at a time. In qualsiasi momento, in un flusso di nodi XAML aperto è presente solo un record o una posizione corrente e molti aspetti dell'API segnalano unicamente le informazioni disponibili da tale posizione.At any time, only one current record or current position exists in an open XAML node stream, and many aspects of the API report only the information available from that position. Il nodo corrente in un flusso di nodi XAML può essere descritto come un oggetto, un membro o un valore.The current node in a XAML node stream can be described as being an object, a member, or a value. Trattando XAML come flusso di nodi XAML, i reader XAML possono comunicare con i writer XAML e consentire a un programma di visualizzare, interagire con o modificare i contenuti di un flusso di nodi XAML durante un'operazione relativa a un percorso di salvataggio o di caricamento che usa XAML.By treating XAML as a XAML node stream, XAML readers can communicate with XAML writers and enable a program to view, interact with, or alter the contents of a XAML node stream during either a load path or a save path operation that involves XAML. La progettazione delle API di reader e writer XAML e il concetto di flusso di nodi XAML sono analoghi a concetti e progettazioni di reader e writer correlati precedenti, come XML DOM (Document Object Model)XML Document Object Model (DOM) e le classi XmlReader e XmlWriter .XAML reader and writer API design and the XAML node stream concept are similar to previous related reader and writer designs and concepts, such as the XML DOM (Document Object Model)XML Document Object Model (DOM) and the XmlReader and XmlWriter classes. Questo argomento illustra i concetti correlati al flusso di nodi XAML e descrive come scrivere routine che interagiscono con rappresentazioni XAML a livello di nodi XAML.This topic discusses XAML node stream concepts and describes how you can write routines that interact with XAML representations at the XAML node level.

Caricamento di XAML in un reader XAMLLoading XAML into a XAML Reader

La classe base XamlReader non dichiara una tecnica particolare di caricamento del codice XAML iniziale in un reader XAML.The base XamlReader class does not declare a particular technique for loading the initial XAML into a XAML reader. Al contrario, una classe derivata dichiara e implementa la tecnica di caricamento, tra cui le caratteristiche generali e i vincoli dell'origine di input per XAML.Instead, a derived class declares and implements the loading technique, including the general characteristics and constraints of its input source for XAML. Ad esempio, un oggetto XamlObjectReader legge un oggetto grafico, a partire dall'origine di input di un singolo oggetto che rappresenta la radice o base.For example, a XamlObjectReader reads an object graph, starting from the input source of a single object that represents the root or base. L'oggetto XamlObjectReader produce quindi un flusso di nodi XAML dall'oggetto grafico.The XamlObjectReader then produces a XAML node stream from the object graph.

La più importante sottoclasse di XamlReader definita dai servizi XAML di .NET Framework è XamlXmlReader.The most prominent .NET Framework XAML Services–defined XamlReader subclass is XamlXmlReader. XamlXmlReader carica il codice XAML iniziale, caricando un file di testo direttamente tramite un flusso o un percorso di file o indirettamente tramite una classe reader correlata, come TextReader.XamlXmlReader loads the initial XAML, either by loading a text file directly through a stream or file path, or indirectly through a related reader class such as TextReader. Si può pensare a XamlReader come a un oggetto contenente tutta l'origine di input XAML dopo il caricamento.The XamlReader can be thought of as containing the entirety of the XAML input source after it has loaded. Tuttavia, l'API di base di XamlReader è progettata in modo che il reader interagisca con un singolo nodo XAML.However, the XamlReader base API is designed so that the reader is interacting with a single node of the XAML. Quando viene eseguito il caricamento per la prima volta, il primo nodo singolo incontrato è la radice di XAML e il relativo oggetto iniziale.When first loaded, the first single node you encounter is the root of the XAML, and its start object.

Concetto di flusso di nodi XAMLThe XAML Node Stream Concept

Per chi ha maggiore familiarità con il modello DOM, la metafora dell'albero o l'approccio basato su query per l'accesso a tecnologie basate su XML, un modo utile per definire il concetto di flusso di nodi XAML è il seguente.If you are generally more familiar with a DOM, tree metaphor, or query-based approach towards accessing XML-based technologies, a helpful way to conceptualize a XAML node stream is as follows. Si immagini che il codice XAML caricato sia un modello DOM o un albero in cui ogni nodo possibile è espanso completamente e quindi presentato in modo lineare.Imagine that the loaded XAML is a DOM or a tree where every possible node is expanded all the way, and then presented linearly. Avanzando tra i nodi, si potrebbe entrare o uscire da livelli che sarebbero rilevanti per un modello DOM, ma il flusso di nodi XAML non ne tiene traccia in modo esplicito in quanto questi concetti relativi ai livelli non sono rilevanti per un flusso di nodi.As you advance through the nodes, you might be traversing "in" or "out" of levels that would be relevant to a DOM, but the XAML node stream does not explicitly keep track because these level concepts are not relevant to a node stream. Il flusso di nodi ha una posizione "corrente", ma a meno che non siano state archiviate altre parti del flusso come riferimenti, ogni aspetto del flusso di nodi al di fuori della posizione del nodo corrente non viene visualizzato.The node stream has a "current" position, but unless you have stored other parts of the stream yourself as references, every aspect of the node stream other than the current node position is out of view.

Il concetto di flusso di nodi XAML offre il considerevole vantaggio che, se si scorre l'intero flusso di nodi, si può essere certi che sia stata elaborata l'intera rappresentazione XAML. Non è necessario preoccuparsi del fatto che in una query, un'operazione DOM o altri approcci non lineari all'elaborazione delle informazioni venga persa una parte della rappresentazione XAML completa.The XAML node stream concept has the notable advantage that if you go through the entire node stream, you are assured that you have processed the entire XAML representation; you do not need to worry that a query, a DOM operation, or some other nonlinear approach to processing information has missed some part of the complete XAML representation. Per questo motivo, la rappresentazione del flusso di nodi XAML è ideale per la connessione di reader XAML e writer XAML e per fornire un sistema che consenta di inserire un proprio processo che opera tra le fasi di lettura e scrittura di un'operazione di elaborazione XAML.For this reason, the XAML node stream representation is ideal both for connecting XAML readers and XAML writers, and for providing a system where you can insert your own process that acts between the read and write phases of a XAML processing operation. In molti casi, l'ordine dei nodi nel flusso di nodi XAML viene deliberatamente ottimizzato o riorganizzato dai reader XAML rispetto all'ordine che potrebbe caratterizzare l'oggetto grafico, il file binario o il testo di origine.In many cases, the ordering of nodes in the XAML node stream is deliberately optimized or reordered by XAML readers versus how the order might appear in the source text, binary, or object graph. Questo comportamento è finalizzato ad applicare un'architettura di elaborazione XAML in cui i writer XAML non si trovano mai in una posizione in cui devono tornare "indietro" nel flusso di nodi.This behavior is intended to enforce a XAML processing architecture whereby XAML writers are never in a position where they have to go "back" in the node stream. Idealmente, tutte le operazioni di scrittura XAML devono poter essere eseguite in base al contesto dello schema e alla posizione corrente del flusso di nodi.Ideally, all XAML write operations should be able to act based on schema context plus the current position of the node stream.

Ciclo di nodi di lettura di baseA Basic Reading Node Loop

Un ciclo di nodi di lettura di base per l'esame di un flusso di nodi XAML è costituito dai concetti seguenti.A basic reading node loop for examining a XAML node stream consists of the following concepts. Ai fini dei cicli di nodi descritti in questo argomento, si presupponga di leggere un file XAML leggibile basato su testo tramite XamlXmlReader.For purposes of node loops as discussed in this topic, assume that you are reading a text-based, human-readable XAML file using XamlXmlReader. I collegamenti in questa sezione si riferiscono all'API del ciclo di nodi XAML specifica implementata da XamlXmlReader.The links in this section refer to the particular XAML node loop API implemented by XamlXmlReader.

  • Assicurarsi di non trovarsi alla fine del flusso di nodi XAML (controllare IsEofoppure usare il valore restituito di Read ).Make sure that you are not at the end of the XAML node stream (check IsEof, or use the Read return value). Se ci si trova alla fine del flusso, non vi è alcun nodo corrente ed è necessario uscire.If you are at the end of the stream, there is no current node and you should exit.

  • Controllare il tipo di nodo attualmente esposto dal flusso di nodi XAML chiamando NodeType.Check what type of node the XAML node stream currently exposes by calling NodeType.

  • Se si dispone di un writer di oggetti XAML associato connesso direttamente, a questo punto si chiama in genere WriteNode .If you have an associated XAML object writer that is connected directly, you generally call WriteNode at this point.

  • In base al valore XamlNodeType segnalato per il nodo corrente o il record corrente, chiamare una delle proprietà seguenti per ottenere informazioni sui contenuti del nodo:Based on which XamlNodeType is reported as the current node or current record, call one of the following to obtain information about the node contents:

    • Per la proprietà NodeType di StartMember o EndMember, chiamare Member per ottenere le informazioni di XamlMember su un membro.For a NodeType of StartMember or EndMember, call Member to obtain XamlMember information about a member. Si noti che il membro può essere un oggetto XamlDirectivee pertanto potrebbe non essere un membro convenzionale definito dal tipo dell'oggetto precedente.Note that the member might be a XamlDirective, and thus might not necessarily be a conventional type-defined member of the preceding object. Ad esempio, x:Name applicato a un oggetto corrisponde a un membro XAML dove IsDirective è true e la proprietà Name del membro è Name, con altre proprietà che indicano che questa direttiva si trova nello spazio dei nomi XAML del linguaggio XAML.For example, x:Name applied to an object appears as a XAML member where IsDirective is true and the Name of the member is Name, with other properties indicating that this directive is under the XAML language XAML namespace.

    • Per la proprietà NodeType di StartObject o EndObject, chiamare Type per ottenere le informazioni di XamlType su un oggetto.For a NodeType of StartObject or EndObject, call Type to obtain XamlType information about an object.

    • Per la proprietà NodeType di Value, chiamare Value.For a NodeType of Value, call Value. Un nodo è un valore solo se è l'espressione più semplice di un valore per un membro o il testo di inizializzazione per un oggetto (tuttavia, è opportuno tenere conto del comportamento di conversione dei tipi illustrato più avanti in questo argomento).A node is a value only if it is the simplest expression of a value for a member, or the initialization text for an object (however, you should be aware of type conversion behavior as documented in an upcoming section of this topic).

    • Per la proprietà NodeType di NamespaceDeclaration, chiamare Namespace per ottenere informazioni sullo spazio dei nomi per un nodo spazio dei nomi.For a NodeType of NamespaceDeclaration, call Namespace to obtain namespace information for a namespace node.

  • Chiamare Read per far avanzare il reader XAML al nodo successivo nel flusso di nodi XAML e ripetere la procedura.Call Read to advance the XAML reader to the next node in the XAML node stream, and repeat the steps again.

Il flusso di nodi XAML fornito dai reader XAML di servizi XAML di .NET Framework offre sempre un attraversamento completo e dettagliato di tutti i nodi possibili.The XAML node stream provided by .NET Framework XAML Services XAML readers always provides a full, deep traversal of all possible nodes. Tra le tipiche tecniche di controllo di flusso per un ciclo di nodi XAML vi sono la definizione di un corpo in while (reader.Read())e l'attivazione di NodeType in corrispondenza di ogni punto nodo nel ciclo di nodi.Typical flow-control techniques for a XAML node loop include defining a body within while (reader.Read()), and switching on NodeType at each node point in the node loop.

Se il flusso di nodi è alla fine del file, il nodo corrente è null.If the node stream is at end of file, the current node is null.

Il ciclo più semplice che usa un reader e un writer è simile all'esempio riportato di seguito.The simplest loop that uses a reader and writer resembles the following example.

XamlXmlReader xxr = new XamlXmlReader(new StringReader(xamlStringToLoad));  
//where xamlStringToLoad is a string of well formed XAML  
XamlObjectWriter xow = new XamlObjectWriter(xxr.SchemaContext);  
while (xxr.Read()) {  
  xow.WriteNode(xxr);  
}  

Questo esempio di base di un ciclo di nodi XAML del percorso di caricamento connette in modo trasparente il reader XAML e il writer XAML, in modo analogo a quanto avviene usando XamlServices.Parse.This basic example of a load path XAML node loop transparently connects the XAML reader and XAML writer, doing nothing different than if you had used XamlServices.Parse. Ma questa struttura di base viene quindi espansa per essere applicata allo scenario di lettura o scrittura.But this basic structure is then expanded to apply to your reading or writing scenario. Ecco alcuni degli scenari possibili: Some possible scenarios are as follows:

  • Attivare NodeType.Switch on NodeType. Eseguire azioni diverse a seconda del tipo di nodo letto.Perform different actions depending on which node type is being read.

  • Non chiamare WriteNode in tutti i casi.Do not call WriteNode in all cases. Chiamare WriteNode solo per alcuni valori di NodeType .Only call WriteNode in some NodeType cases.

  • Nella logica per un determinato tipo di nodo, analizzare le specifiche di tale nodo e agire di conseguenza.Within the logic for a particular node type, analyze the specifics of that node and act on them. Ad esempio, è possibile scrivere solo oggetti provenienti da un determinato spazio dei nomi XAML e quindi rimuovere o rinviare gli oggetti che non provengono da tale spazio dei nomi XAML.For example, you could write only objects that come from a particular XAML namespace, and then drop or defer any objects not from that XAML namespace. In alternativa, è possibile rimuovere o rielaborare in altro modo qualsiasi direttiva XAML non supportata dal sistema XAML come parte dell'elaborazione dei membri.Or you could drop or otherwise reprocess any XAML directives that your XAML system does not support as part of your member processing.

  • Definire un oggetto XamlObjectWriter personalizzato che esegue l'override dei metodi Write* , eventualmente con un mapping dei tipi che consenta il bypass del contesto dello schema XAML.Define a custom XamlObjectWriter that overrides Write* methods, possibly performing type mapping that bypasses XAML schema context.

  • Costruire l'oggetto XamlXmlReader in modo da usare un contesto dello schema XAML non predefinito, affinché le differenze personalizzate nel comportamento XAML vengano usate sia dal reader sia dal writer.Construct the XamlXmlReader to use a nondefault XAML schema context, so that customized differences in XAML behavior are used both by the reader and the writer.

Accesso a XAML non legato al concetto di ciclo di nodiAccessing XAML Beyond the Node Loop Concept

Vi sono altri modi, non legati al concetto di ciclo di nodi, per usare una rappresentazione XAML.There are potentially other ways to work with a XAML representation other than as a XAML node loop. Potrebbe ad esempio essere disponibile un reader XAML in grado di leggere un nodo indicizzato oppure di accedere direttamente ai nodi tramite x:Name, x:Uido altri identificatori.For example, there could exist a XAML reader that can read an indexed node, or in particular accesses nodes directly by x:Name, by x:Uid, or through other identifiers. I servizi XAML di .NET Framework non forniscono un'implementazione completa, ma forniscono un modello consigliato tramite servizi e tipi di supporto..NET Framework XAML Services does not provide a full implementation, but provides a suggested pattern through services and support types. Per altre informazioni, vedere IXamlIndexingReader e XamlNodeList.For more information, see IXamlIndexingReader and XamlNodeList.

Suggerimento

Microsoft produce inoltre un rilascio fuori programma noto come Microsoft XAML Toolkit.Microsoft also produces an out-of-band release known as the Microsoft XAML Toolkit. Tale soluzione è al momento disponibile in una versione non definitiva.This out-of-band release is still in its pre-release stages. Per chi tuttavia è disposto a lavorare con componenti non definitivi, Microsoft XAML Toolkit fornisce alcune risorse interessanti per strumenti XAML e analisi statica del codice XAML.However, if you are willing to work with pre-release components, the Microsoft XAML Toolkit provides some interesting resources for XAML tooling and static analysis of XAML. Microsoft XAML Toolkit include un'API DOM XAML, supporto per l'analisi FxCop e un contesto dello schema XAML per Silverlight.The Microsoft XAML Toolkit includes a XAML DOM API, support for FxCop analysis, and a XAML schema context for Silverlight. Per ulteriori informazioni, vedere la pagina relativa a Microsoft XAML Toolkit.For more information, see Microsoft XAML Toolkit.

Uso del nodo correnteWorking with the Current Node

Nella maggior parte degli scenari in cui viene usato un ciclo di nodi XAML non vengono solo letti i nodi,Most scenarios that use a XAML node loop do not only read the nodes. ma vengono anche elaborati i nodi correnti e ogni nodo viene passato a un'implementazione di XamlWriter.Most scenarios process current nodes and pass each node one at a time to an implementation of XamlWriter.

Nello scenario tipico di percorso di caricamento, un oggetto XamlXmlReader produce un flusso di nodi XAML, i nodi XAML vengono elaborati in base alla logica e al contesto dello schema XAML e vengono passati a un oggetto XamlObjectWriter.In the typical load path scenario, a XamlXmlReader produces a XAML node stream; the XAML nodes are processed according to your logic and XAML schema context; and the nodes are passed to a XamlObjectWriter. L'oggetto grafico risultante viene quindi integrato nell'applicazione o nel framework.You then integrate the resulting object graph into your application or framework.

In uno scenario tipico di percorso di salvataggio, un oggetto XamlObjectReader legge l'oggetto grafico, i singoli nodi XAML vengono elaborati e un oggetto XamlXmlWriter restituisce il risultato serializzato come file di testo XAML.In a typical save path scenario, a XamlObjectReader reads the object graph, individual XAML nodes are processed, and a XamlXmlWriter outputs the serialized result as a XAML text file. L'aspetto principale riguarda il fatto che entrambi i percorsi e gli scenari comportano l'uso di esattamente un nodo XAML per volta e i nodi XAML possono essere gestiti in un modo standardizzato, definito dal sistema di tipi XAML e dalle API dei servizi XAML di .NET Framework.The key is that both paths and scenarios involve working with exactly one XAML node at a time, and the XAML nodes are available for treatment in a standardized way that is defined by the XAML type system and the.NET Framework XAML Services APIs.

Frame e ambitoFrames and Scope

Un ciclo di nodi XAML attraversa un flusso di nodi XAML in modo lineare.A XAML node loop walks through a XAML node stream in a linear way. Il flusso di nodi attraversa oggetti, membri che contengono altri oggetti e così via.The node stream traverses into objects, into members that contain other objects, and so on. Spesso è utile tenere traccia dell'ambito all'interno del flusso di nodi XAML mediante l'implementazione di un concetto di frame e stack.It is often useful to keep track of scope within the XAML node stream by implementing a frame and stack concept. Ciò è particolarmente utile se si modifica attivamente il flusso di nodi mentre ci si trova al suo interno.This is particularly true if you are actively adjusting the node stream while you are in it. Il supporto di frame e stack implementato come parte della logica del ciclo di nodi può contare gli ambiti di StartObject (o GetObject) e EndObject man mano che si scende in una struttura di nodi XAML, se si pensa alla struttura da una prospettiva DOM.The frame and stack support that you implement as part of your node loop logic could count StartObject (or GetObject) and EndObject scopes as you descend into a XAML node structure if the structure is thought of from a DOM perspective.

Attraversamento e ingresso nei nodi oggettoTraversing and Entering Object Nodes

Il primo nodo in un flusso quando viene aperto da un reader XAML è il nodo oggetto iniziale dell'oggetto radice.The first node in a node stream when it is opened by a XAML reader is the start-object node of the root object. Per definizione, questo oggetto è sempre un nodo singolo senza peer.By definition, this object is always a single object node and has no peers. In qualsiasi esempio XAML reale, l'oggetto radice è definito con una o più proprietà che contengono più oggetti e queste proprietà presentano nodi membro.In any real-world XAML example, the root object is defined to have one or more properties that hold more objects, and these properties have member nodes. I nodi membro dispongono quindi di uno o più nodi oggetto oppure possono terminare con un nodo valore.The member nodes then have one or more object nodes, or might also terminate in a value node instead. In genere, l'oggetto radice definisce gli ambiti dei nomi XAML, che sono assegnati sintatticamente come attributi nel markup di testo XAML, ma che sono mappati a un tipo di nodo Namescope nella rappresentazione del flusso di nodi XAML.The root object typically defines XAML namescopes, which are syntactically assigned as attributes in the XAML text markup but map to a Namescope node type in the XAML node stream representation.

Considerare l'esempio XAML seguente, costituito da codice XAML arbitrario, non supportato da tipi esistenti in .NET Framework.Consider the following XAML example (this is arbitrary XAML, not backed by existing types in the .NET Framework). Si presupponga che in questo modello a oggetti FavorCollection sia un oggetto List<T> di Favor, che Balloon e NoiseMaker possano essere assegnati a Favor, che la proprietà Balloon.Color sia supportata da un oggetto Color analogo al modo in cui WPF definisce i colori come nomi di colori noti e che Color supporti un convertitore di tipi per la sintassi di attributo.Assume that in this object model, FavorCollection is List<T> of Favor, Balloon and NoiseMaker are assignable to Favor, the Balloon.Color property is backed by a Color object similar to how WPF defines colors as known color names, and Color supports a type converter for attribute syntax.

Markup XAMLXAML markup Flusso di nodi XAML risultanteResulting XAML node stream
<Party Namespace per PartyNamespace node for Party
xmlns="PartyXamlNamespace"> StartObject per PartyStartObject node for Party
<Party.Favors> StartMember per Party.FavorsStartMember node for Party.Favors
NodoStartObject per l'oggetto FavorCollectionimplicitoStartObject node for implicit FavorCollection
NodoStartMember per la proprietà degli elementi FavorCollection implicitiStartMember node for implicit FavorCollection items property.
<Balloon StartObject per BalloonStartObject node for Balloon
Color="Red" StartMember per ColorStartMember node for Color

Value per la stringa di valore di attributo "Red"Value node for the attribute value string "Red"

EndMember per ColorEndMember for Color
HasHelium="True" StartMember per HasHeliumStartMember node for HasHelium

Value per la stringa di valore di attributo "True"Value node for the attribute value string "True"

EndMember per HasHeliumEndMember for HasHelium
> EndObject per BalloonEndObject for Balloon
<NoiseMaker>Loudest</NoiseMaker> StartObject per NoiseMakerStartObject node for NoiseMaker

StartMember per _InitializationStartMember node for _Initialization

Value per la stringa di valore di inizializzazione "Loudest"Value node for the initialization value string "Loudest"

EndMember per _InitializationEndMember node for _Initialization

EndObject per NoiseMakerEndObject for NoiseMaker
NodoEndMember per la proprietà degli elementi FavorCollection implicitiEndMember node for implicit FavorCollection items property.
NodoEndObject per l'oggetto FavorCollectionimplicitoEndObject node for implicit FavorCollection
</Party.Favors> EndMember per FavorsEndMember for Favors
</Party> EndObject per PartyEndObject for Party

Nel flusso di nodi XAML è possibile fare affidamento sul comportamento illustrato di seguito:In the XAML node stream, you can rely on the following behavior:

  • Se è presente un nodo Namespace , viene aggiunto al flusso immediatamente prima dell'oggetto StartObject che ha dichiarato lo spazio dei nomi XAML con xmlns.If a Namespace node exists, it is added to the stream immediately before the StartObject that declared the XAML namespace with xmlns. Osservare di nuovo la tabella precedente con il codice XAML e il flusso di nodi di esempio.Look at the previous table with the XAML and example node stream again. Si noti che i nodi StartObject e Namespace sembrano essere invertiti rispetto alle relative posizioni di dichiarazione nel markup di testo.Notice how the StartObject and Namespace nodes seem to be transposed versus their declaration positions in text markup. Ciò è rappresentativo del comportamento in base a cui i nodi spazio dei nomi vengono sempre visualizzati prima del nodo a cui si applicano nel flusso di nodi.This is representative of the behavior where the namespace nodes always appear ahead of the node they apply to in the node stream. Ciò è dovuto al fatto che le informazioni dello spazio dei nomi sono fondamentali per i writer di oggetti e devono essere note al writer prima di poter eseguire il mapping dei tipi o elaborare in altro modo l'oggetto.The purpose of this design is that the namespace information is vital to object writers and must be known before the object writer attempts to perform type mapping or otherwise process the object. Il posizionamento delle informazioni dello spazio dei nomi XAML prima del relativo ambito di applicazione nel flusso semplifica l'elaborazione del flusso di nodi sempre nell'ordine di presentazione.Placing the XAML namespace information ahead of its application scope in the stream makes it simpler to always process the node stream in its presented order.

  • Tenendo presenti le considerazioni precedenti, nella maggior parte dei casi di markup reali, quando si attraversano i nodi dall'inizio, si leggono prima uno o più nodi Namespace rispetto all'oggetto StartObject della radice.Because of the above consideration, it is one or more Namespace nodes that you read first in most real-world markup cases when traversing nodes from the start, not the StartObject of the root.

  • Un nodo StartObject può essere seguito da un oggetto StartMember, Valueo immediatamente da EndObject.A StartObject node can be followed by StartMember, Value, or an immediate EndObject. Non è mai seguito immediatamente da un altro oggetto StartObject.It is never followed immediately by another StartObject.

  • Un oggetto StartMember può essere seguito da un oggetto StartObject, Valueo immediatamente da EndMember.A StartMember can be followed by a StartObject, Value, or an immediate EndMember. Può essere seguito da GetObject, per i membri il cui valore si suppone provenire da un valore esistente dell'oggetto padre anziché da un oggetto StartObject che creerebbe un'istanza di un nuovo valore.It can be followed by GetObject, for members where the value is supposed to come from an existing value of the parent object rather than a StartObject that would instantiate a new value. Può anche essere seguito da un nodo Namespace , che si applica a un oggetto StartObjectsuccessivo.It can also be followed by a Namespace node, which applies to an upcoming StartObject. Non è mai seguito immediatamente da un altro oggetto StartMember.It is never followed immediately by another StartMember.

  • Un nodo Value rappresenta il valore stesso e non è previsto alcun oggetto "EndValue".A Value node represents the value itself; there is no "EndValue". Può essere seguito solo da un oggetto EndMember.It can be followed only by an EndMember.

    • Il testo di inizializzazione XAML dell'oggetto come potrebbe venire usato per costruzione non comporta la creazione di una struttura oggetto-valore.XAML initialization text of the object as might be used by construction does not result in an Object-Value structure. Viene invece creato un nodo membro dedicato per un membro denominato _InitializationInstead, a dedicated member node for a member named _Initialization is created. e tale nodo membro contiene la stringa di valore di inizializzazione.and that member node contains the initialization value string. Se presente, _Initialization è sempre il primo oggetto StartMember.If it exists, _Initialization is always the first StartMember. L'oggetto_Initialization può essere qualificato in alcune rappresentazioni dei servizi XAML con l'ambito dei nomi XAML del linguaggio XAML, per specificare che _Initialization non è una proprietà definita nei tipi di supporto._Initialization may be qualified in some XAML services representations with the XAML language XAML namescope, to clarify that _Initialization is not a defined property in backing types.

    • Una combinazione membro-valore rappresenta un'impostazione di attributo del valore.A Member-Value combination represents an attribute setting of the value. Per l'elaborazione del valore potrebbe venire usato un convertitore di valori e il valore è una stringa semplice.There might eventually be a value converter involved in processing this value, and the value is a plain string. Tuttavia, il valore non viene valutato fino a quando un writer di oggetti XAML non elabora il flusso di nodi.However, that is not evaluated until a XAML object writer processes this node stream. Il writer di oggetti XAML dispone del contesto dello schema XAML necessario, del mapping del sistema di tipi e di altri tipo di supporto necessari per le conversioni dei valori.The XAML object writer possesses the necessary XAML schema context, type system mapping, and other support needed for value conversions.

  • Un nodo EndMember può essere seguito da un nodo StartMember per un membro successivo o da un nodo EndObject per il proprietario del membro.An EndMember node can be followed by a StartMember node for a subsequent member, or by an EndObject node for the member owner.

  • Un nodo EndObject può essere seguito da un nodo EndMember .An EndObject node can be followed by an EndMember node. Può anche essere seguito da un nodo StartObject per i casi in cui gli oggetti sono peer negli elementi di una raccolta.It can also be followed by a StartObject node for cases where the objects are peers in a collection's items. In alternativa, può essere seguito da un nodo Namespace , che si applica a un oggetto StartObjectsuccessivo.Or it can be followed by a Namespace node, which applies to an upcoming StartObject.

    • Esclusivamente nel caso della chiusura dell'intero flusso di nodi, l'oggetto EndObject della radice non è seguito da niente, il reader ha raggiunto la fine del file e Read restituisce false.For the unique case of closing the entire node stream, the EndObject of the root is not followed by anything; the reader is now end-of-file, and Read returns false.

Convertitori di valori e flusso di nodi XAMLValue Converters and the XAML Node Stream

Un convertitore di valori è un termine generale per un'estensione di markup, un convertitore di tipi (inclusi i serializzatori di valori) o un'altra classe dedicata segnalata come convertitore di valori nel sistema di tipi XAML.A value converter is a general term for a markup extension, a type converter (including value serializers) or another dedicated class that is reported as a value converter through the XAML type system. Nel flusso di nodi XAML, l'utilizzo di un convertitore di tipi e l'utilizzo di un'estensione di markup hanno rappresentazioni molto diverse.In the XAML node stream, a type converter usage and a markup extension usage have very different representations.

Convertitori di tipi nel flusso di nodi XAMLType Converters in the XAML Node Stream

Un set di attributi che comporta l'utilizzo di un convertitore di tipi viene segnalato nel flusso di nodi XAML come valore di un membro.An attribute set that eventually results in a type converter usage is reported in the XAML node stream as a value of a member. Il flusso di nodi XAML non tenta di produrre un oggetto istanza del convertitore di tipi e passare a esso il valore.The XAML node stream does not attempt to produce a type converter instance object and pass the value to it. Per usare un'implementazione della conversione di un convertitore di tipi è necessario richiamare il contesto dello schema XAML e usarlo per il mapping dei tipi.Using a type converter's conversion implementation requires invoking the XAML schema context and using it for type-mapping. Anche per determinare quale classe di convertitore di tipi deve essere usata per elaborare il valore è necessario indirettamente il contesto dello schema XAML.Even determining which type converter class should be used to process the value requires the XAML schema context indirectly. Quando si usa il contesto dello schema XAML predefinito, tali informazioni sono disponibili dal sistema di tipi XAML.When you use the default XAML schema context, that information is available from the XAML type system. Se sono necessarie informazioni sulla classe del convertitore di tipi a livello di flusso di nodi XAML prima della connessione a un writer XAML, è possibile ottenerle dalle informazioni di XamlMember del membro che viene impostato.If you need the type converter class information at the XAML node stream level before connection to a XAML writer, you can obtain it from the XamlMember information of the member being set. In caso contrario, l'input del convertitore di tipi deve essere mantenuto nel flusso di nodi XAML come valore semplice fino a quando non vengono eseguite le restanti operazioni che richiedono il sistema di mapping dei tipi e il contesto dello schema XAML, ad esempio la creazione dell'oggetto da parte di un writer di oggetti XAML.But otherwise, type converter input should be preserved in the XAML node stream as a plain value until the remainder of operations that require the type mapping system and XAML schema context are performed, for example the object creation by a XAML object writer.

Si consideri, ad esempio, la seguente struttura di definizione di classe e il relativo utilizzo XAML:For example, consider the following class definition outline and XAML usage for it:

public class BoardSizeConverter : TypeConverter {  
  //converts from string to an int[2] by splitting on an "x" char  
}  
public class GameBoard {  
  [TypeConverter(typeof(BoardSizeConverter))]  
  public int[] BoardSize; //2x2 array, initialization not shown  
}  
<GameBoard BoardSize="8x8"/>  

Una rappresentazione di testo del flusso di nodi XAML per questo utilizzo può essere espressa come segue:A text representation of the XAML node stream for this usage could be expressed as the following:

StartObject con XamlType per rappresentare GameBoardStartObject with XamlType representing GameBoard

StartMember con XamlMember per rappresentare BoardSizeStartMember with XamlMember representing BoardSize

NodoValue , con stringa di testo "8x8"Value node, with text string "8x8"

EndMember corrisponde a BoardSizeEndMember matches BoardSize

EndObject corrisponde a GameBoardEndObject matches GameBoard

Si noti che non è presente alcuna istanza di convertitore di tipi in questo flusso di nodi.Notice that there is no type converter instance in this node stream. È tuttavia possibile ottenere informazioni sul convertitore di tipi chiamando XamlMember.TypeConverter su XamlMember per BoardSize.But you can get type converter information by calling XamlMember.TypeConverter on the XamlMember for BoardSize. Se si dispone di un contesto dello schema XAML valido, è anche possibile richiamare i metodi del convertitore ottenendo un'istanza da ConverterInstance.If you have a valid XAML schema context, you can also invoke the converter methods by obtaining an instance from ConverterInstance.

Estensioni di markup nel flusso di nodi XAMLMarkup Extensions in the XAML Node Stream

L'utilizzo di un'estensione di markup viene segnalato nel flusso di nodi XAML come nodo oggetto all'interno di un membro, in cui l'oggetto rappresenta un'istanza dell'estensione di markup.A markup extension usage is reported in the XAML node stream as an object node within a member, where the object represents a markup extension instance. L'utilizzo di un'estensione di markup viene presentato pertanto in modo più esplicito nella rappresentazione del flusso di nodi rispetto all'utilizzo di un convertitore di tipi e fornisce maggiori informazioni.Thus a markup extension usage is presented more explicitly in the node stream representation than a type converter usage is, and carries more information. Le informazioni diXamlMember potrebbero non aver fornito dati in relazione all'estensione di markup, poiché l'utilizzo varia in base alle situazioni e a ogni caso possibile markup e non è dedicato né implicito per ogni tipo o membro come nel caso del convertitori di tipi.XamlMember information could not have told you anything about the markup extension, because the usage is situational and varies in each possible markup case; it is not dedicated and implicit per type or member as is the case with type converters.

La rappresentazione del flusso di nodi delle estensioni di markup come nodi oggetto avviene anche se l'utilizzo dell'estensione di markup è stato fatto in forma di attributo nel markup di testo XAML, come spesso accade.The node stream representation of markup extensions as object nodes is the case even if the markup extension usage was made in attribute form in the XAML text markup (which is often the case). I casi di utilizzo di un'estensione di markup in forma di elemento oggetto esplicito vengono trattati nello stesso modo.Markup extension usages that used an explicit object element form are treated the same way.

In un nodo oggetto di un'estensione di markup possono essere presenti membri di tale estensione di markup.Within a markup extension object node, there may be members of that markup extension. La rappresentazione del flusso di nodi XAML preserva l'utilizzo di tale estensione di markup, sia in caso di utilizzo di un parametro posizionale sia di utilizzo con parametri denominati espliciti.The XAML node stream representation preserves the usage of that markup extension, whether that be a positional parameter usage or a usage with explicit named parameters.

In caso di utilizzo di un parametro posizionale, il flusso di nodi XAML contiene una proprietà _PositionalParameters definita dal linguaggio XAML che registra l'utilizzo.For a positional parameter usage, the XAML node stream contains a XAML language-defined property _PositionalParameters that records the usage. Questa proprietà è un oggetto List<T> generico con vincolo Object .This property is a generic List<T> with Object constraint. Il vincolo è un oggetto e non una stringa perché presumibilmente l'utilizzo di un parametro posizionale potrebbe contenere utilizzi di estensioni di markup annidati.The constraint is object and not string because conceivably a positional parameter usage could contain nested markup extension usages within it. Per accedere ai parametri posizionali dall'utilizzo, è possibile eseguire l'iterazione nell'elenco e usare gli indicizzatori per i singoli valori di elenco.To access the positional parameters from the usage, you could iterate through the list and use the indexers for individual list values.

Per l'utilizzo di un parametro denominato, ogni parametro denominato è rappresentato come nodo membro di tale nome nel flusso di nodi.For a named parameter usage, each named parameter is represented as a member node of that name in the node stream. I valori dei membri non sono necessariamente stringhe, poiché potrebbe essere presente un utilizzo di estensioni di markup annidato.The member values are not necessarily strings, because there could be a nested markup extension usage.

L'oggettoProvideValue dall'estensione di markup non è stato ancora richiamato.ProvideValue from the markup extension is not yet invoked. Viene tuttavia richiamato se si connettono un reader XAML e un writer XAML in modo che venga richiamato WriteEndObject nel nodo dell'estensione di markup quando lo si esamina nel flusso di nodi.However, it is invoked if you connect a XAML reader and XAML writer so that WriteEndObject is invoked on the markup extension node when you examine it in the node stream. Per questo motivo, è in genere necessario che sia disponibile lo stesso contesto dello schema XAML che verrebbe usato per creare l'oggetto grafico nel percorso di caricamento.For this reason, you generally need the same XAML schema context available as would be used in order to form the object graph on the load path. In caso contrario, l'oggetto ProvideValue da qualsiasi estensione di markup può generare eccezioni, in quanto non sono disponibili i servizi previsti.Otherwise, ProvideValue from any markup extension can throw exceptions here, because it does not have expected services available.

Membri definiti dai linguaggi XAML e XML nel flusso di nodi XAMLXAML and XML Language-Defined Members in the XAML Node Stream

Alcuni membri vengono introdotti in un flusso di nodi XAML a causa di interpretazioni e convenzioni di un reader XAML, anziché tramite una costruzione o una ricerca esplicita di XamlMember .Certain members are introduced to a XAML node stream because of interpretations and conventions of a XAML reader, instead of through an explicit XamlMember lookup or construction. Spesso, questi membri sono direttive XAML.Often, these members are XAML directives. In alcuni casi, è l'operazione di lettura del codice XAML che introduce la direttiva nel flusso di nodi XAML.In some cases, it is the act of reading the XAML that introduces the directive into the XAML node stream. In altre parole, il testo XAML di input originale non specifica in modo esplicito la direttiva membro, ma il reader XAML inserisce la direttiva per soddisfare una convenzione strutturale del linguaggio XAML e segnalare le informazioni nel flusso di nodi XAML prima che vadano perse.In other words, the original input XAML text did not explictly specify the member directive, but the XAML reader inserts the directive in order to satisfy a structural XAML convention and report information in the XAML node stream before that information is lost.

L'elenco seguente illustra tutti i casi in cui si prevede che un reader XAML introduca un nodo membro direttiva XAML e il modo in cui tale nodo membro viene identificato nelle implementazioni dei servizi XAML di .NET Framework.The following list notes all cases where a XAML reader is expected to introduce a directive XAML member node, and how that member node is identified in the .NET Framework XAML Services implementations.

  • Testo di inizializzazione per un nodo oggetto: il nome di questo nodo membro è _Initialization, rappresenta una direttiva XAML e viene definito nello spazio dei nomi XAML del linguaggio XAML.Initialization text for an object node: The name of this member node is _Initialization, it represents a XAML directive, and it is defined in the XAML language XAML namespace. È possibile ottenere un'entità statica per esso da Initialization.You can get a static entity for it from Initialization.

  • Parametri posizionali per un'estensione di markup: il nome di questo nodo membro è _PositionalParameterse viene definito nello spazio dei nomi XAML del linguaggio XAML.Positional parameters for a markup extension: The name of this member node is _PositionalParameters, and it is defined in the XAML language XAML namespace. Contiene sempre un elenco generico di oggetti, ognuno dei quali è un parametro posizionale pre-separato con il carattere delimitatore , come specificato nel codice XAML di input.It always contains a generic list of objects, each of which is a positional parameter pre-separated by splitting on the , delimiter character as supplied in the input XAML. È possibile ottenere un'entità statica per la direttiva di parametri posizionali da PositionalParameters.You can get a static entity for the positional parameters directive from PositionalParameters.

  • Contenuto sconosciuto: il nome di questo nodo membro è _UnknownContent.Unknown content: The name of this member node is _UnknownContent. Nello specifico, si tratta di un oggetto XamlDirectivee viene definito nello spazio dei nomi XAML del linguaggio XAML.Strictly speaking, it is a XamlDirective, and it is defined in the XAML language XAML namespace. Questa direttiva viene usata come elemento sentinel per i casi in cui un elemento oggetto XAML include contenuto nel codice XAML di origine, ma non è possibile determinare alcuna proprietà del contenuto nel contesto dello schema XAML attualmente disponibile.This directive is used as a sentinel for cases where a XAML object element contains content in the source XAML but no content property can be determined under the currently available XAML schema context. È possibile rilevare questo caso in un flusso di nodi XAML controllando la presenza di membri denominati _UnknownContent.You can detect this case in a XAML node stream by checking for members named _UnknownContent. Se non viene eseguita alcuna altra azione nel flusso di nodi XAML del percorso di caricamento, l'oggetto XamlObjectWriter predefinito genera un'eccezione nel caso di un tentativo di chiamare WriteEndObject quando viene rilevato il membro _UnknownContent in qualsiasi oggetto.If no other action is taken in a load path XAML node stream, the default XamlObjectWriter throws on attempted WriteEndObject when it encounters the _UnknownContent member on any object. L'oggetto XamlXmlWriter predefinito non genera un'eccezione e tratta il membro come implicito.The default XamlXmlWriter does not throw, and treats the member as implicit. È possibile ottenere un'entità statica per _UnknownContent da UnknownContent.You can get a static entity for _UnknownContent from UnknownContent.

  • Proprietà di raccolta per una raccolta: anche se il tipo CLR di supporto sottostante di una classe di raccolta in uso per XAML dispone in genere di una proprietà denominata dedicata che contiene gli elementi della raccolta, tale proprietà non è nota a un sistema di tipi XAML prima della risoluzione del tipo di supporto.Collection property of a collection: Although the backing CLR type of a collection class that is used for XAML usually has a dedicated named property that holds the collection items, that property is not known to a XAML type system prior to backing type resolution. Il flusso di nodi XAML introduce invece un segnaposto Items come membro del tipo XAML della raccolta.Instead, the XAML node stream introduces an Items placeholder as a member of the collection XAML type. Nell'implementazione dei servizi XAML di .NET Framework il nome di questo membro/direttiva nel flusso di nodi è _Items.In the .NET Framework XAML Services implementation the name of this directive / member in the node stream is _Items. È possibile ottenere una costante per questa direttiva da Items.A constant for this directive can be obtained from Items.

    Si noti che un flusso di nodi XAML può contenere una proprietà Items con elementi che risultano non essere analizzabili in base alla risoluzione del tipo di supporto e al contesto dello schema XAML.Note that a XAML node stream might contain an Items property with items that turn out to not be parseable based on the backing type resolution and XAML schema context. Ad esempio,For example,

  • Membri definiti da XML: i membri xml:base, xml:lang e xml:space definiti da XML sono segnalati come direttive XAML denominate base, lange space nelle implementazioni dei servizi XAML di .NET Framework.XML-defined members: The XML-defined xml:base, xml:lang and xml:space members are reported as XAML directives named base, lang, and space in the .NET Framework XAML Services implementations. Lo spazio dei nomi per questi membri è lo spazio dei nomi XML http://www.w3.org/XML/1998/namespace.The namespace for these is the XML namespace http://www.w3.org/XML/1998/namespace. È possibile ottenere costanti per ognuno di essi da XamlLanguage.Constants for each of these can be obtained from XamlLanguage.

Ordine dei nodiNode Order

In alcuni casi, XamlXmlReader modifica l'ordine dei nodi XAML nel flusso di nodi XAML rispetto all'ordine in cui i nodi vengono visualizzati nel markup o elaborati come XML.In some cases, XamlXmlReader changes the order of XAML nodes in the XAML node stream, versus the order the nodes appear if viewed in the markup or if processed as XML. Lo scopo è quello di ordinare i nodi in modo tale che un oggetto XamlObjectWriter possa elaborare il flusso dei nodi solo procedendo in avanti.This is done in order to order the nodes such that a XamlObjectWriter can process the node stream in a forward-only manner. Nei servizi XAML di .NET Framework, il reader XAML riordina i nodi anziché lasciare questa attività al writer XAML, per ottimizzare le prestazioni per i consumer di writer di oggetti XAML del flusso di nodi.In .NET Framework XAML Services, the XAML reader reorders nodes rather than leaving this task to the XAML writer, as a performance optimization for XAML object writer consumers of the node stream.

Alcune direttive sono finalizzate in modo specifico a fornire maggiori informazioni per la creazione di un oggetto da un elemento oggetto.Certain directives are intended specifically to provide more information for the creation of an object from an object element. Tali direttive sono Initialization, PositionalParameters, TypeArguments, FactoryMethod, Arguments.These directives are: Initialization, PositionalParameters, TypeArguments, FactoryMethod, Arguments. I reader XAML dei servizi XAML di .NET Framework tentano di inserire queste direttive come primi membri nel flusso di nodi dopo l'elemento StartObjectdi un oggetto, per i motivi illustrati nella sezione seguente.The .NET Framework XAML Services XAML readers attempt to place these directives as the first members in the node stream following an object's StartObject, for reasons that are explained in the next section.

Comportamento di XamlObjectWriter e ordine dei nodiXamlObjectWriter Behavior and Node Order

StartObject per XamlObjectWriter non segnala necessariamente al writer di oggetti XAML di costruire immediatamente l'istanza dell'oggetto.StartObject to a XamlObjectWriter is not necessarily a signal to the XAML object writer to immediately construct the object instance. XAML include diverse funzionalità del linguaggio che consentono di inizializzare un oggetto con un input aggiuntivo senza fare completamente affidamento sulla richiamata di un costruttore predefinito per produrre l'oggetto iniziale e quindi impostare le proprietà.XAML includes several language features that make it possible to initialize an object with additional input, and to not rely entirely on invoking a default constructor to produce the initial object, and only then setting properties. Tali funzionalità includono XamlDeferLoadAttribute, testo di inizializzazione, x:TypeArguments, parametri posizionali di un'estensione di markup, metodi factory e nodi x:Arguments associati (XAML 2009).These features include: XamlDeferLoadAttribute; initialization text; x:TypeArguments; positional parameters of a markup extension; factory methods and associated x:Arguments nodes (XAML 2009). Ognuno di questi casi ritarda la costruzione effettiva dell'oggetto e poiché il flusso di nodi viene riordinato, il writer di oggetti XAML può dipendere da un comportamento che prevede la costruzione effettiva dell'istanza ogni volta che viene rilevato un membro iniziale che non è specificamente una direttiva di costruzione per tale tipo di oggetto.Each of these cases delay the actual object construction, and because the node stream is reordered, the XAML object writer can rely on a behavior of actually constructing the instance whenever a start member is encountered that is not specifically a construction directive for that object type.

GetObjectGetObject

GetObject rappresenta un nodo XAML in cui anziché costruire un nuovo oggetto, un writer di oggetti XAML deve ottenere il valore della proprietà che contiene l'oggetto.GetObject represents a XAML node where rather than constructing a new object, a XAML object writer should instead get the value of the object's containing property. Un caso tipico in cui un nodo GetObject viene rilevato in un flusso di nodi XAML riguarda un oggetto raccolta o un oggetto dizionario, quando la proprietà che contiene l'oggetto è deliberatamente di sola lettura nel modello a oggetti del tipo di supporto.A typical case where a GetObject node is encountered in a XAML node stream is for a collection object or a dictionary object, when the containing property is deliberately read-only in the backing type's object model. In questo scenario, la raccolta o il dizionario viene spesso creato e inizializzato (in genere come oggetto vuoto) dalla logica di inizializzazione di un tipo proprietario.In this scenario, the collection or dictionary often is created and initialized (usually empty) by the initialization logic of an owning type.

Vedere ancheSee Also

XamlObjectReader
Servizi XAMLXAML Services
Spazi dei nomi XAMLXAML Namespaces