Panoramica delle estensioni di markup per XAMLMarkup Extensions for XAML Overview

Le estensioni di markup sono una tecnica XAML per ottenere un valore che non è una primitiva né un tipo XAML specifico.Markup extensions are a XAML technique for obtaining a value that is neither a primitive nor a specific XAML type. Per utilizzo dell'attributo, le estensioni di markup usano la sequenza di caratteri nota costituita da una parentesi graffa aperta { per l'immissione dell'ambito dell'estensione di markup e da una parentesi graffa chiusa } .For attribute usage, markup extensions use the known character sequence of an opening curly brace { to enter the markup extension scope, and a closing curly brace } to exit. Quando si usano i servizi XAML di .NET Framework, si possono usare alcune delle estensioni di markup predefinite del linguaggio XAML contenute nell'assembly System.Xaml.When using .NET Framework XAML Services, you can use some of the predefined XAML language markup extensions from the System.Xaml assembly. inoltre possibile creare una sottoclasse dalla classe MarkupExtension , definita in System.Xaml, e definire estensioni di markup personalizzate.You can also subclass from the MarkupExtension class, defined in System.Xaml, and define your own markup extensions. In alternativa, è possibile usare le estensioni di markup definite da un particolare framework se già si fa riferimento a tale framework. Or you can use markup extensions defined by a particular framework if you are already referencing that framework .

Quando viene eseguito l'accesso a un utilizzo dell'estensione di markup, il writer di oggetti XAML può fornire servizi a una classe MarkupExtension personalizzata tramite un punto di connessione del servizio nell'override del metodo MarkupExtension.ProvideValue.When a markup extension usage is accessed, the XAML object writer can provide services to a custom MarkupExtension class through a service connection point in the MarkupExtension.ProvideValue override. I servizi possono essere usati per ottenere il contesto relativo all'utilizzo, funzionalità specifiche del writer di oggetti, il contesto dello schema XAML e così via.The services can be used to obtain context about the usage, specific capabilities of the object writer, XAML schema context, and so on.

Estensioni di markup definite da XAMLXAML-Defined Markup Extensions

Diverse estensioni di markup vengono implementate dai servizi XAML di .NET Framework per il supporto del linguaggio XAML.Several markup extensions are implemented by .NET Framework XAML Services for XAML language support. Le estensioni di markup corrispondono a parti della specifica di XAML come linguaggio.These markup extensions correspond to parts of the specification of XAML as a language. In genere, queste estensioni sono identificabili dal prefisso x: nella sintassi come illustrato nell'utilizzo comune.These are typically identifiable by the x: prefix in the syntax as seen in common usage. Le implementazioni dei servizi XAML di .NET Framework per questi elementi del linguaggio XAML derivano tutte dalla classe base MarkupExtension .The .NET Framework XAML Services implementations for these XAML language elements all derive from the MarkupExtension base class .

Nota

Il prefisso x: viene usato per il mapping dello spazio dei nomi XAML tipico dello spazio dei nomi del linguaggio XAML, nell'elemento radice di una produzione XAML.The x: prefix is used for the typical XAML namespace mapping of the XAML language namespace, in the root element of a XAML production. Ad esempio, i modelli di progetto e pagina di Visual Studio per diversi framework specifici avviano un file XAML usando il x: mapping.For example, the Visual Studio project and page templates for various specific frameworks initiate a XAML file using this x: mapping. Nel mapping dello spazio dei nomi XAML personalizzato è possibile scegliere un token di prefisso diverso. Tuttavia, per identificare le entità che rappresentano una parte definita dello spazio dei nomi XAML del linguaggio XAML, in questa documentazione viene usato il mapping x: predefinito anziché lo spazio dei nomi XAML predefinito di un framework specifico o altri spazi dei nomi CLR o XML arbitrari.You could choose a different prefix token in your own XAML namespace mapping, but this documentation will assume the default x: mapping as a means of identifying those entities that are a defined part of the XAML language XAML namespace, as opposed to a specific framework's default XAML namespace or other arbitrary CLR or XML namespaces.

x:Typex:Type

x:Type fornisce l'oggetto Type per il tipo denominato.x:Type supplies the Type object for the named type. Questa funzionalità viene il più delle volte usata nei meccanismi di rinvio che usano il tipo CLR sottostante e la derivazione del tipo come moniker o identificatore di raggruppamento.This functionality is used most frequently in deferral mechanisms that use underlying CLR type and type derivation as a grouping moniker or identifier. Gli stili e i modelli WPF, nonché il loro utilizzo delle proprietà TargetType , sono un esempio specifico.WPF styles and templates, and their usage of TargetType properties, are a specific example. Per altre informazioni, vedere x:Type Markup Extension.For more information, see x:Type Markup Extension.

x:Staticx:Static

x:Static produce valori statici da entità di codice di tipo di valore che non sono direttamente il tipo del valore di una proprietà, ma possono essere valutate in base a tale tipo.x:Static produces static values from value-type code entities that are not directly the type of a property's value, but can be evaluated to that type. Questo è utile per specificare valori già esistenti come costanti note in una definizione del tipo.This is useful for specifying values that already exist as well-known constants in a type definition. Per altre informazioni, vedere x:Static Markup Extension.For more information, see x:Static Markup Extension.

x:Nullx:Null

x:Null specifica null come valore per un membro XAML.x:Null specifies null as a value for a XAML member. In base alla progettazione di tipi specifici o a concetti di framework più ampi, non sempre null è un valore predefinito di una proprietà o il valore implicito dell'attributo di una stringa vuota.Depending on the design of specific types or on larger framework concepts, null is not always a default value for a property, or the implied value of an empty string attribute. Per altre informazioni, vedere x:Null Markup Extension.For more information, see x:Null Markup Extension.

x:Arrayx:Array

x:Array supporta la creazione di matrici generali nella sintassi XAML nei casi in cui si sceglie intenzionalmente di non usare il supporto delle raccolte fornito dagli elementi di base e dai modelli di controllo.x:Array supports creation of general arrays in XAML syntax in cases where the collection support that is provided by base elements and control models is deliberately not used. Per altre informazioni, vedere x:Array Markup Extension.For more information, see x:Array Markup Extension. Nel caso specifico di XAML 2009, l'accesso alle matrici avviene come primitive di linguaggio anziché come un'estensione.In XAML 2009 specifically, arrays are accessed as language primitives instead of as an extension. Per altre informazioni, vedere XAML 2009 Language Features.For more information, see XAML 2009 Language Features.

x:Referencex:Reference

x:Reference fa parte di XAML 2009, un'estensione del set del linguaggio originale (2006).x:Reference is part of XAML 2009, an extension of the original (2006) language set. x:Reference rappresenta un riferimento a un altro oggetto esistente in un oggetto grafico.x:Reference represents a reference to another existing object in an object graph. Questo oggetto viene definito dal relativo attributo x:Name.That object is identified by its x:Name. Per altre informazioni, vedere x:Reference Markup Extension.For more information, see x:Reference Markup Extension.

Altri costrutti x:Other x: Constructs

Esistono altri costrutti x: che supportano le funzionalità del linguaggio XAML, che però non sono implementati come estensioni di markup.Other x: constructs to support XAML language features exist, but these are not implemented as markup extensions. Per altre informazioni, vedere XAML Namespace (x:) Language Features.For more information, see XAML Namespace (x:) Language Features.

Classe base MarkupExtensionThe MarkupExtension Base Class

Per definire un'estensione di markup personalizzata che possa interagire con le implementazioni predefinite di reader XAML e writer XAML in System.Xaml, è possibile derivare una classe dalla classe MarkupExtension astratta.To define a custom markup extension that can interact with the default implementations of XAML readers and XAML writers in System.Xaml, you derive a class from the abstract MarkupExtension class. Questa classe ha di un unico metodo di cui eseguire l'override, ovvero ProvideValue.That class has one method to override, which is ProvideValue. Potrebbe anche essere necessario definire costruttori aggiuntivi per il supporto di argomenti dell'utilizzo dell'estensione di markup, nonché le proprietà impostabili.You might also need to define additional constructors to support arguments to the markup extension usage, and matching settable properties.

Tramite ProvideValue, un'estensione di markup personalizzata dispone di accesso a un contesto del servizio che segnala l'ambiente in cui l'estensione di markup viene effettivamente richiamata da un processore XAML.Through ProvideValue, a custom markup extension has access to a service context that reports the environment where the markup extension is actually invoked by a XAML processor. Nel percorso di caricamento si tratta in genere di un oggetto XamlObjectWriter.In the load path this is typically a XamlObjectWriter. Nel percorso di salvataggio si tratta in genere di un oggetto XamlXmlWriter.In the save path this is typically a XamlXmlWriter. Il contesto del servizio viene segnalato come classe di contesto del provider di servizi XAML interna che implementa un modello del provider di servizi.Each report the service context as an internal XAML service provider context class that implements a service provider pattern. Per altre informazioni sui servizi disponibili e su ciò che rappresentano, vedere Type Converters and Markup Extensions for XAML.For more information about the available services and what they represent, see Type Converters and Markup Extensions for XAML.

La classe dell'estensione di markup deve usare un livello di accesso pubblico. I processori XAML devono essere sempre in grado di creare un'istanza della classe di supporto dell'estensione di markup in modo da usare i relativi servizi.Your markup extension class must use a public access level; XAML processors must always be able to instantiate the markup extension's support class in order to use its services.

Definizione del tipo di supporto per un'estensione di markup personalizzataDefining the Support Type for a Custom Markup Extension

Quando si usano i servizi XAML di .NET Framework o framework basati sui servizi XAML di .NET Framework, esistono due possibilità per denominare il tipo di supporto dell'estensione di markup.When you use .NET Framework XAML Services or frameworks that build on .NET Framework XAML Services, you have two choices for how to name the markup extension support type. Il nome del tipo è rilevante per la modalità con cui i writer dell'oggetto XAML tentano di accedere e richiamare un tipo di supporto dell'estensione di markup quando rilevano un utilizzo dell'estensione di markup in XAML.The type name is relevant to how XAML object writers attempt to access and invoke a markup extension support type when they encounter a markup extension usage in XAML. Usare una delle strategie di denominazione seguenti:Use one of the following naming strategies:

  • Denominare il tipo in modo che corrisponda esattamente al token di utilizzo del markup XAML.Name the type name to be an exact match to the XAML markup usage token. Ad esempio, per supportare l'utilizzo di un'estensione {Collate ...} , denominare il tipo di supporto Collate.For example, to support a {Collate ...} extension usage, name the support type Collate.

  • Denominare il tipo in modo che corrisponda al token della stringa dell'utilizzo seguito dal suffisso Extension.Name the type name to be the usage string token plus the suffix Extension. Ad esempio, per supportare l'utilizzo di un'estensione {Collate ...} , denominare il tipo di supporto CollateExtension.For example, to support a {Collate ...} extension usage, name the support type CollateExtension.

L'ordine di ricerca prevede che venga cercato per primo il nome della classe con il suffisso Extension, quindi il nome della classe senza il suffisso Extension .The order of lookup is to look for the Extension-suffixed class name first and then look for the class name without the Extension suffix.

Dal punto di vista dell'utilizzo del markup, l'inclusione del suffisso Extension come parte dell'utilizzo è una procedura valida.From the markup usage perspective, including the Extension suffix as part of the usage is valid. Tuttavia, Extension viene considerato a tutti gli effetti parte del nome della classe, per cui i writer di oggetti XAML non riuscirebbero a risolvere una classe di supporto dell'estensione di markup per quell'utilizzo se la stessa classe non avesse il suffisso Extension .However, this behaves as if Extension is truly part of the class name, and XAML object writers would fail to resolve a markup extension support class for that usage if the support class did not have the Extension suffix.

Costruttore predefinitoThe Default Constructor

Per tutti i tipi di supporto dell'estensione di markup è necessario esporre un costruttore pubblico predefinito.For all markup extension support types, you should expose a public default constructor. È necessario un costruttore predefinito per qualsiasi caso in cui un writer dell'oggetto XAML crei un'istanza dell'estensione di markup dall'utilizzo di un elemento oggetto.A default constructor is required for any case where a XAML object writer instantiates the markup extension from an object element usage. L'utilizzo dell'elemento oggetto di supporto è un'aspettativa legittima per un'estensione di markup, specialmente per la serializzazione.Supporting object element usage is a fair expectation for a markup extension, particularly for serialization. Si può tuttavia possibile implementare un'estensione di markup senza un costruttore pubblico quando si intende supportare solo gli utilizzi degli attributi dell'estensione di markup.However, you can implement a markup extension without a public constructor if you only intend to support attribute usages of the markup extension.

Se l'utilizzo dell'estensione di markup non dispone di argomenti, il costruttore predefinito sarà necessario per supportare l'utilizzo.If your markup extension usage has no arguments, the default constructor is required to support usage.

Modelli di costruttore e argomenti posizionali per un'estensione di markup personalizzataConstructor Patterns and Positional Arguments for a Custom Markup Extension

Per un'estensione di markup con utilizzo degli argomenti previsto, i costruttori pubblici devono corrispondere alle modalità dell'utilizzo previsto.For a markup extension with intended argument usage, the public constructors must correspond to the modes of the intended usage. In altri termini, se l'estensione di markup viene progettata per richiedere un argomento posizionale come utilizzo valido, è necessario supportare un costruttore pubblico con un parametro di input che accetti l'argomento posizionale.In other words, if your markup extension is designed to require one positional argument as a valid usage, you should support a public constructor with one input parameter that takes the positional argument.

Si supponga ad esempio che sia previsto che l'estensione di markup Collate supporti solo una modalità in cui è presente un argomento posizionale che rappresenta la relativa modalità, specificato come costante di enumerazione CollationMode .For example, suppose the Collate markup extension is intended to support only a mode where there is one positional argument that represents its mode, specified as a CollationMode enumeration constant. In questo caso, è necessario che sia presente un costruttore nel formato seguente:In this case, there should be a constructor with the following form:

public Collate(CollationMode collationMode) {...}  

A un livello di base, gli argomenti passati a un'estensione di markup sono costituiti da una stringa in quanto vengono inoltrati dai valori dell'attributo del markup.At a basic level, the arguments passed to a markup extension are a string because they are being forwarded from the markup's attribute values. È possibile rendere stringhe tutti gli argomenti e utilizzare l'input a tale livello.You can make all of your arguments strings and work with input at that level. Si dispone tuttavia dell'accesso a determinate attività di elaborazione che vengono eseguite prima del passaggio degli argomenti dell'estensione di markup alla classe di supporto.However, you do have access to certain processing that occurs before the markup extension arguments are passed to the support class.

L'elaborazione viene eseguita a livello concettuale come se l'estensione di markup fosse un oggetto da creare, quindi vengono impostati i valori di membro.The processing works conceptually as if the markup extension is an object to be created, and then its member values are set. Ogni proprietà specificata da impostare viene valutata nello stesso modo in cui un membro specificato può essere impostato su un oggetto creato durante l'analisi del codice XAML.Each specified property to set is evaluated similar to how a specified member can be set on a created object when XAML is parsed. Vi sono due differenze importanti:There are two important differences:

  • Come osservato in precedenza, non è necessario che un'estensione di markup disponga di un costruttore predefinito perché sia possibile crearne un'istanza in XAML.As noted previously, a markup extension support type does not need to have a default constructor in order to be instantiated in XAML. La costruzione di oggetti viene rinviata fino a quando gli argomenti possibili corrispondenti nella sintassi del testo non vengono convertiti in formato token e valutati come argomenti posizionali o denominati e il costruttore appropriato non viene a quel punto chiamato.Its object construction is deferred until its possible arguments in the text syntax are tokenized and evaluated as either positional or named arguments, and the appropriate constructor is called at that time.

  • Gli utilizzi delle estensioni di markup possono essere annidati.Markup extensions usages can be nested. L'estensione di markup più interna viene valutata per prima.The innermost markup extension is evaluated first. È dunque possibile presupporre tale utilizzo e dichiarare uno dei parametri della costruzione come tipo che richiede un convertitore di valori, ad esempio un'estensione di markup, da produrre.Therefore, you can assume such a usage and declare one of the construction parameters to be a type that requires a value converter (such as a markup extension) to produce.

Nell'esempio precedente viene illustrato l'affidamento su tale elaborazione.A reliance on such processing was shown in the previous example. Il writer di oggetti XAML dei servizi XAML di .NET Framework elabora i nomi delle costanti di enumerazione in valori enumerati a livello nativo.The .NET Framework XAML Services XAML object writer processes enumeration constant names into enumerated values at a native level.

L'elaborazione della sintassi del testo di un parametro posizionale dell'estensione di markup può anche basarsi su un convertitore di tipi associato al tipo nell'argomento della costruzione.Processing text syntax of a markup extension positional parameter can also rely on a type converter that is associated with the type that is in the construction argument.

Gli argomenti sono detti argomenti posizionali perché l'ordine in base al quale vengono rilevati i token nell'utilizzo corrisponde all'ordine posizionale del parametro del costruttore a cui sono assegnati.The arguments are called positional arguments because the order in which the tokens in the usage is encountered corresponds to the positional order of the constructor parameter to which they are assigned. Si consideri ad esempio la firma del costruttore seguente:For example, consider the following constructor signature:

public Collate(CollationMode collationMode, object collateThis) {...}  

Un processore XAML prevede la presenza di due argomenti posizionali per questa estensione di markup.A XAML processor expects two positional arguments for this markup extension. Per un utilizzo {Collate AlphaUp,{x:Reference circularFile}}, il token AlphaUp viene inviato al primo parametro e quindi valutato come costante denominata dell'enumerazione CollationMode .If there was a usage {Collate AlphaUp,{x:Reference circularFile}}, the AlphaUp token is sent to the first parameter and evaluated as a CollationMode enumeration named constant. Il risultato dell'argomento x:Reference interno viene inviato al secondo parametro e valutato come oggetto.The result of the inner x:Reference is sent to the second parameter and evaluated as an object.

Nelle regole specificate per XAML per la sintassi e l'elaborazione dell'estensione di markup, la virgola è il delimitatore degli argomenti, sia posizionali che denominati.In the XAML specified rules for markup extension syntax and processing, the comma is the delimiter between arguments, whether those arguments are positional arguments or named arguments.

Grado duplicato di argomenti posizionaliDuplicate Arity of Positional Arguments

Se un writer di oggetti XAML rileva un utilizzo dell'estensione di markup con argomenti posizionali e sono presenti più argomenti del costruttore che accettano il numero di argomenti specificato (un grado duplicato), non si tratta necessariamente di un errore.If a XAML object writer encounters a markup extension usage with positional arguments, and there are multiple constructor arguments that take that number of arguments (a duplicate arity), that is not necessarily an error. Il comportamento dipende da un'impostazione del contesto dello schema XAML personalizzabile, SupportMarkupExtensionsWithDuplicateArity.The behavior depends on a customizable XAML schema context setting, SupportMarkupExtensionsWithDuplicateArity. Se SupportMarkupExtensionsWithDuplicateArity è true, un writer di oggetti XAML non genera un'eccezione solo per motivi di grado duplicato.If SupportMarkupExtensionsWithDuplicateArity is true, a XAML object writer should not throw an exception only for reasons of duplicate arity. Il comportamento oltre tale punto non è definito con precisione.Behavior beyond that point is not strictly defined. Il presupposto di base per la progettazione è che il contesto dello schema disponga di informazioni sul tipo disponibili per i parametri specifici e possa tentare cast espliciti corrispondenti ai candidati duplicati per individuare la firma che potenzialmente costituisce la corrispondenza ottimale.The basic design assumption is that the schema context has type information available for the specific parameters and can attempt explicit casts that match the duplicate candidates to see which signature might be the best match. È comunque possibile che venga generata un'eccezione se nessuna delle firme supera i test imposti da tale particolare contesto dello schema in esecuzione in un writer di oggetti XAML.An exception might still be thrown if no signatures can pass the tests that are imposed by that particular schema context that is running on a XAML object writer.

Per impostazione predefinita, SupportMarkupExtensionsWithDuplicateArity è false nell'oggetto XamlSchemaContext basato su CLR per i servizi XAML di .NET Framework.By default, SupportMarkupExtensionsWithDuplicateArity is false in the CLR-based XamlSchemaContext for .NET Framework XAML Services. L'oggetto XamlObjectWriter predefinito, pertanto, genera eccezioni se rileva un utilizzo dell'estensione di markup con grado duplicato nei costruttori del tipo sottostante.Thus, the default XamlObjectWriter throws exceptions if it encounters a markup extension usage where there is duplicate arity in the backing type's constructors.

Argomenti denominati per un'estensione di markup personalizzataNamed Arguments for a Custom Markup Extension

Le estensioni di markup specificate da XAML possono anche usare argomenti denominati per l'utilizzo.Markup extensions as specified by XAML can also use a named arguments form for usage. Al primo livello di tokenizzazione, la sintassi del testo è divisa in argomenti.At the first level of tokenization, the text syntax is divided into arguments. La presenza di un segno di uguale (=) all'interno di qualsiasi argomento lo identifica come argomento denominato.The presence of an equals sign (=) within any argument identifies an argument as a named argument. L'argomento viene inoltre convertito in formato token in una coppia nome/valore.Such an argument is also tokenized into a name/value pair. Il nome in questo caso denomina una proprietà impostabile pubblica del tipo di supporto dell'estensione di markup.The name in this case names a public settable property of the markup extension's support type. Se si intende supportare l'utilizzo di argomenti denominati, sarà necessario fornire queste proprietà impostabili pubbliche.If you intend to support named argument usage, you should provide these public settable properties. Le proprietà possono essere proprietà ereditate, fino a quando rimangono pubbliche.The properties can be inherited properties as long as they remain public.

Accesso al contesto del provider di servizi da un'implementazione dell'estensione di markupAccessing Service Provider Context from a Markup Extension Implementation

I servizi disponibili sono gli stessi per qualsiasi convertitore di valori.The services available are the same for any value converter. L'unica differenza risiede nel modo in cui ogni convertitore di valori riceve il contesto del servizio.The difference is in how each value converter receives the service context. L'accesso ai servizi e i servizi disponibili sono illustrati nell'argomento Type Converters and Markup Extensions for XAML.Accessing services and the services available are documented in the topic Type Converters and Markup Extensions for XAML.

Utilizzo dell'elemento proprietà di un'estensione di markupProperty Element Usage of a Markup Extension

Gli scenari per gli utilizzi di estensioni di markup sono spesso progettati attorno all'uso dell'estensione di markup nell'utilizzo dell'attributo.The scenarios for markup extension usages are often designed around using the markup extension in attribute usage. Tuttavia, si può anche definire la classe sottostante in modo che supporti l'utilizzo dell'elemento proprietà.However, it is also potentially possible to define the backing class to support property element usage.

Per supportare l'utilizzo dell'elemento proprietà dell'estensione di markup, definire un costruttore predefinito pubblico.To support property element usage of your markup extension, define a public default constructor. Deve trattarsi di un costruttore di istanza, non di un costruttore statico.This should be an instance constructor not a static constructor. Questo è necessario perché un processore XAML deve in genere richiamare il costruttore predefinito in qualsiasi elemento oggetto elaborato dal markup, incluse le classi dell'estensione di markup come elementi oggetto.This is required because a XAML processor must generally invoke the default constructor on any object element it processes from markup, and this includes markup extension classes as object elements. Per gli scenari avanzati, è possibile definire percorsi di costruzione non predefiniti per le classi.For advanced scenarios, you can define non-default construction paths for classes. (Per ulteriori informazioni, vedere direttiva X:FactoryMethod.) Tuttavia, non si devono usare questi modelli per scopi di estensione di markup poiché questo rende molto più difficile l'individuazione del modello di utilizzo tanto per i progettisti quanto per gli utenti di markup non elaborato.(For more information, see x:FactoryMethod Directive.) However, you should not use these patterns for markup extension purposes because this makes discovery of the usage pattern much more difficult, both for designers and for users of raw markup.

Associazione di attributi per un'estensione di markup personalizzataAttributing for a Custom Markup Extension

Per supportare sia gli ambienti di progettazione sia determinati scenari dei writer di oggetti XAML, è necessario associare al tipo di supporto dell'estensione di markup diversi attributi CLR.To support both design environments and certain XAML object writer scenarios, you should attribute a markup extension support type with several CLR attributes. Questi attributi indicano l'utilizzo dell'estensione di markup desiderato.These attributes report the intended markup extension usage.

MarkupExtensionReturnTypeAttribute specifica le informazioni Type per il tipo di oggetto restituito da ProvideValue .MarkupExtensionReturnTypeAttribute reports the Type information for the object type that ProvideValue returns. In base alla semplice firma, ProvideValue restituisce Object.By its pure signature, ProvideValue returns Object. Diversi consumer potrebbero però richiedere informazioni più precise sul tipo restituito,But various consumers might want more precise return type information. vale a dire:This includes:

  • Finestre di progettazione e IDE, potenzialmente in grado di fornire supporto dipendente dal tipo per gli utilizzi delle estensioni di markup.Designers and IDEs, who might be able to provide type-aware support for markup extension usages.

  • Implementazioni avanzate di gestori SetMarkupExtension in classi di destinazione, che possono basarsi sulla reflection per determinare il tipo restituito di un'estensione di markup anziché creare un ramo in implementazioni di MarkupExtension specifiche note in base al nome.Advanced implementations of SetMarkupExtension handlers on target classes, which might rely on reflection to determine a markup extension's return type instead of branching on specific known MarkupExtension implementations by name.

Serializzazione degli utilizzi di estensioni di markupSerialization of Markup Extension Usages

Quando un writer di oggetti XAML elabora un utilizzo dell'estensione di markup e chiama ProvideValue, il contesto del metodo che è stato precedentemente un utilizzo dell'estensione di markup viene reso persistente nel flusso del nodo XAML, ma non nell'oggetto grafico.When a XAML object writer processes a markup extension usage and calls ProvideValue, the context for it previously being a markup extension usage persists in the XAML node stream but not in the object graph. Nell'oggetto grafico viene mantenuto solo il valore.In the object graph, only the value is preserved. In presenza di scenari di progettazione o altri motivi che determinano la necessità di rendere persistente l'utilizzo dell'estensione di markup originale nell'output serializzato, sarà necessario progettare un'infrastruttura personalizzata per la verifica degli utilizzi delle estensioni di markup dal flusso del nodo XAML del percorso di caricamento.If you have design scenarios or other reasons for persisting the original markup extension usage into the serialized output, you must design your own infrastructure for tracking the markup extension usages from the load path XAML node stream. Si può implementare il comportamento per ricreare gli elementi del flusso del nodo dal percorso di caricamento e riprodurli per i writer XAML per la serializzazione nel percorso di salvataggio, sostituendo il valore nella posizione appropriata del flusso del nodo.You can implement behavior to recreate the elements of the node stream from the load path and play them back to XAML writers for serialization in the save path, substituting for the value in the appropriate position of the node stream.

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

Se si usa un flusso del nodo XAML nel percorso di caricamento, un utilizzo dell'estensione di markup viene visualizzato come oggetto nel flusso del nodo.If you are working with a XAML node stream on the load path, a markup extension usage appears in the node stream as an object.

Se l'utilizzo dell'estensione di markup usa argomenti posizionali, viene rappresentato come oggetto iniziale con un valore di inizializzazione.If the markup extension usage uses positional arguments, it is represented as a start object with an initialization value. Come rappresentazione di testo approssimativa, il flusso del nodo sarà simile a quanto segue:As a rough text representation, the node stream resembles the following:

StartObject (XamlType è il tipo di definizione dell'estensione di markup, non il tipo restituito)StartObject (XamlType is the markup extension's definition type, not its return type)

StartMember (il nome di XamlMember è _InitializationText)StartMember (name of the XamlMember is _InitializationText)

Value (rappresenta gli argomenti posizionali sotto forma di stringa, inclusi i delimitatori frapposti)Value (value is the positional arguments as a string including the intervening delimiters)

EndMember

EndObject

Un utilizzo dell'estensione di markup con argomenti denominati viene rappresentato come oggetto con membri dei nomi pertinenti, ognuno impostato con valori della stringa di testo.A markup extension usage with named arguments is represented as an object with members of the relevant names, each set with text string values.

In realtà, il richiamo dell'implementazione di ProvideValue di un'estensione di markup necessita del contesto dello schema XAML, poiché questo richiede il mapping dei tipi e la creazione di un'istanza del tipo di supporto dell'estensione di markup.Actually invoking the ProvideValue implementation of a markup extension requires the XAML schema context because that requires type-mapping and creating a markup extension support type instance. Questo è uno dei motivi per cui gli utilizzi dell'estensione di markup sono conservati in questo modo nei flussi del nodo dei servizi XAML di .NET Framework predefiniti. La parte del reader di un percorso di caricamento spesso non ha a disposizione il contesto dello schema XAML necessario.This is one reason why markup extension usages are preserved this way in the default .NET Framework XAML Services node streams - the reader part of a load path often does not have the necessary XAML schema context available.

Se si utilizza un flusso del nodo XAML nel percorso di salvataggio, in genere la rappresentazione dell'oggetto grafico non contiene alcun elemento che possa indicare che l'oggetto da serializzare fosse originariamente fornito da un utilizzo dell'estensione di markup e un risultato ProvideValue .If you are working with a XAML node stream on the save path, there generally is nothing present in an object graph representation that can inform you that the object to serialize was originally provided by a markup extension usage and a ProvideValue result. Negli scenari che richiedono il salvataggio permanente degli utilizzi dell'estensione di markup per le sequenze di andata e ritorno e al contempo l'acquisizione di altre modifiche nell'oggetto grafico, è necessario ideare tecniche personalizzate per preservare la conoscenza di un utilizzo dell'estensione di markup dall'input XAML originale.Scenarios that need to persist markup extension usages for round-tripping while also capturing other changes in the object graph must devise their own techniques for preserving the knowledge of a markup extension usage from the original XAML input. Ad esempio, per ripristinare gli utilizzi dell'estensione di markup, può essere necessario usare il flusso del nodo nel percorso di salvataggio oppure eseguire una sorta di unione tra XAML originale e XAML sottoposto a sequenza di andata e ritorno.For example, to restore the markup extension usages, you may need to work with the node stream on the save path in order to restore markup extension usages, or perform some type of merge between the original XAML and the round-tripped XAML. Alcuni framework che implementano XAML, ad esempio WPF, usano tipi intermedi (espressioni) per rappresentare i casi in cui gli utilizzi dell'estensione di markup hanno fornito i valori.Some XAML-implementing frameworks such as WPF use intermediate types (expressions) to help represent cases where markup extension usages provided the values.

Vedere ancheSee Also

MarkupExtension
Convertitori di tipi ed estensioni di markup per XAMLType Converters and Markup Extensions for XAML
Estensioni di markup e XAML WPFMarkup Extensions and WPF XAML