Contesti di servizio disponibili per convertitori di tipi ed estensioni di markup

Gli autori dei tipi che supportano gli utilizzi di convertitori di tipi e estensioni di markup devono spesso disporre di informazioni contestuali sulla posizione di utilizzo nel markup o nella struttura dell'oggetto grafico circostante. Le informazioni potrebbero essere necessarie per garantire che venga creata correttamente un'istanza dell'oggetto fornito o che vengano definiti i riferimenti dell'oggetto agli oggetti esistenti nell'oggetto grafico. Quando si usano i servizi XAML .NET, il contesto che potrebbe essere necessario viene esposto come una serie di interfacce del servizio. Nel codice di supporto del convertitore di tipi o dell'estensione di markup può essere eseguita una query per un servizio usando il contesto di un provider di servizi disponibile e passato da XamlObjectWriter o da tipi correlati. Il contesto dello schema XAML è disponibile direttamente attraverso uno di questi servizi. In questo argomento viene illustrato come accedere ai contesti di servizio da un'implementazione del convertitore di valori e vengono elencati i servizi generalmente disponibili e i relativi ruoli.

Acquisizione di servizi

In qualità di implementatore di un convertitore di valori, è spesso necessario accedere a un determinato tipo di contesto in cui viene applicato il convertitore di valori. Questo contesto può includere informazioni come il contesto dello schema XAML attivo, l'accesso al sistema di mapping dei tipi fornito dal contesto dello schema XAML e dal writer di oggetti XAML e così via. I servizi disponibili per un'implementazione di un'estensione di markup o un convertitore tipo vengono comunicati tramite i parametri di contesto che fanno parte della firma di ogni metodo virtuale. In ogni caso, si dispone di IServiceProvider implementato nel contesto e si può chiamare IServiceProvider.GetService per richiedere un servizio.

Servizi per un'estensione di markup

MarkupExtension dispone un solo di metodo virtuale, ProvideValue. Il parametro serviceProvider di input rappresenta il modo in cui i servizi vengono comunicati alle implementazioni quando l'estensione di markup viene chiamata da un processore XAML. Nello pseudocodice seguente viene illustrato il modo in cui un'implementazione dell'estensione di markup potrebbe eseguire query per i servizi nel relativo metodo ProvideValue:

public override object ProvideValue(IServiceProvider serviceProvider)
{
    //...
    // Get the IXamlTypeResolver from the service provider
    if (serviceProvider == null)
    {
        throw new ArgumentNullException("serviceProvider");
    }
    IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
    if (xamlTypeResolver == null)
    {
        throw new ArgumentException("IXamlTypeResolver");
    }
    //...
}

Servizi per un convertitore di tipi

TypeConverter dispone di quattro metodi virtuali che usano un contesto del servizio e che supportano utilizzi di XAML. Ognuno di questi metodi passa un parametro context di input. Questo parametro è di tipo ITypeDescriptorContext, ma tale interfaccia eredita IServiceProvidered è quindi disponibile un metodo GetService per le implementazioni di convertitori di tipi.

Nello pseudocodice seguente viene illustrato il modo in cui un'implementazione del convertitore di tipi per utilizzi di XAML potrebbe eseguire query per i servizi in uno dei relativi override, in questo caso ConvertFrom:

public override object ConvertFrom(ITypeDescriptorContext typeDescriptorContext,
  CultureInfo cultureInfo,
  object source)
{
    IRootObjectProvider rootProvider = typeDescriptorContext.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
    if (rootProvider != null && source is String)
    {
        //return something, else ...
    }
    throw GetConvertFromException(source);
}

Servizi per un serializzatore di valori

Per il contesto del serializzatore di valori, si usa un tipo di provider di servizi specifico per la classe ValueSerializer , IValueSerializerContext. Tale contesto viene passato agli override dei quattro metodi virtuali di ValueSerializer . Per ottenere servizi, chiamare GetService dal contesto.

Utilizzo dei contesti di provider di servizi XAML

Il provider di servizi per l'accesso GetService ai servizi XAML disponibili per estensioni di markup o convertitori di tipo viene implementato come classe interna, con esposizione solo tramite l'interfaccia e secondo la modalità con cui viene passato nel contesto pertinente. Ogni volta che un'operazione di elaborazione XAML nelle implementazioni predefinite dei servizi XAML .NET del percorso di caricamento o del percorso di salvataggio richiama i metodi di estensione di markup o convertitore di tipi pertinenti che richiedono un contesto di servizio, questo oggetto interno viene passato. A seconda delle circostanze, il contesto del servizio del sistema fornisce MarkupExtensionContext o TextSyntaxContext, sebbene le specifiche di entrambe queste classi siano interne. L'interazione con queste classi è limitato alla richiesta dei servizi da tali classi tramite GetService.

Servizi disponibili dal contesto del servizio XAML .NET

I servizi XAML .NET definiscono i servizi per estensioni di markup, convertitori di tipi, serializzatori di valori e potenzialmente altri utilizzi. Nelle sezioni seguenti viene descritto ognuno di questi servizi e forniscono materiale sussidiario sulla modalità di utilizzo del servizio in un'implementazione.

IServiceProvider

Documentazione di riferimento: IServiceProvider

Rilevante per: funzionamento di base di un'infrastruttura basata su servizi in .NET in modo da poter chiamare IServiceProvider.GetService.

ITypeDescriptorContext

Documentazione di riferimento: ITypeDescriptorContext

Classe derivata da IServiceProvider. Questa classe rappresenta il contesto nelle firme TypeConverter standard; TypeConverter è una classe già esistente da .NET Framework 1.0. Anticipa XAML e lo scenario XAML TypeConverter per la conversione del tipo valore stringa. Nel contesto dei servizi XAML .NET i metodi di TypeConverter vengono implementati in modo esplicito. Il comportamento dell'implementazione esplicita indica ai chiamanti che l'API ITypeDescriptorContext non è relativa a sistemi di tipi XAML o alla lettura o scrittura di oggetti da XAML. Container, Instancee PropertyDescriptor in genere restituiscono null da contesti di servizi XAML .NET.

IValueSerializerContext

Documentazione di riferimento: IValueSerializerContext

Deriva da ITypeDescriptorContext e si basa anche su implementazioni esplicite per eliminare le implicazioni erronee relative al sistema di tipi XAML. Supporta i metodi di supporto statici della ricerca in ValueSerializer.

IXamlTypeResolver

Documentazione di riferimento: IXamlTypeResolver

Definito da: System.Windows.Markup spazio dei nomi, assembly System.Xaml

Relativo a: scenari del percorso di caricamento e interazione con il contesto dello schema XAML

API del servizio: Resolve

Può influire sul mapping dei tipi da XAML a CLR che si rende necessario quando il writer XAML costruisce un oggetto CLR in un oggetto grafico. Resolve elabora una stringa di prefisso potenzialmente qualificata che corrisponde al nome di un tipo XAML (XamlType.Name) e restituisce un oggetto TypeCLR. La risoluzione dei tipi in genere dipende in misura rilevante dal contesto dello schema XAML. Determinati aspetti, ad esempio quali assembly vengono caricati e a quali di questi è possibile o necessario accedere per la risoluzione di tipi, vengono considerati esclusivamente dal contesto dello schema XAML.

IUriContext

Documentazione di riferimento: IUriContext

Definito da: System.Windows.Markup spazio dei nomi, assembly System.Xaml

Relativo a: gestione del percorso di caricamento e del percorso di salvataggio di valori di membro che sono valori di URI o x:Uri .

API del servizio: BaseUri

Questo servizio segnala una radice dell'URI disponibile a livello globale, se presente. La radice dell'URI può essere usata per risolvere gli URI relativi in URI assoluti o viceversa. Questo scenario riguarda principalmente i servizi dell'applicazione esposti da un particolare framework o le funzionalità di una classe di elementi radice di uso frequente in un framework. L'URI di base può essere stabilito come impostazione del reader XAML, che viene quindi passata al writer di oggetti XAML e segnalata da questo servizio.

IAmbientProvider

Documentazione di riferimento: IAmbientProvider

Definito da: System.Xaml spazio dei nomi, assembly System.Xaml

Relativo a: gestione del percorso di caricamento e rinvii o ottimizzazioni della ricerca di tipi.

API del servizio: GetAllAmbientValues altre tre.

Il concetto di ambiente in XAML è relativo a una tecnica per contrassegnare un particolare membro di un tipo come ambiente. In alternativa, un tipo può costituire un ambiente in modo che tutti i valori di proprietà contenenti un'istanza del tipo debbano essere considerati proprietà di ambiente. Le estensioni di markup o convertitori di tipi che si trovano più all'interno nel flusso del nodo XAML e sono discendenti nell'oggetto grafico possono accedere alla proprietà di ambiente o l'istanza del tipo al momento del caricamento oppure usare la conoscenza della struttura di ambiente al momento del salvataggio. Ciò può influire sul grado di qualificazione necessario per la risoluzione dei tipi per altri servizi, ad esempio per IXamlTypeResolver o per x:Type. Vedere anche AmbientPropertyValue.

IXamlSchemaContextProvider

Documentazione di riferimento: IXamlSchemaContextProvider

Definito da: System.Xaml spazio dei nomi, assembly System.Xaml

Relativo a: percorso di caricamento e qualsiasi operazione che deve risolvere un tipo XAML in un tipo di supporto.

API del servizio: SchemaContext

Il contesto dello schema XAML è necessario per qualsiasi operazione di caricamento posticipato, poiché lo stesso contesto dello schema deve agire sull'area posticipata per integrare il contenuto posticipato. Per altre informazioni sul ruolo del contesto dello schema XAML, vedere XAML Services.

IRootObjectProvider

Documentazione di riferimento: IRootObjectProvider

Definito da: System.Xaml spazio dei nomi, assembly System.Xaml

Relativo a: percorso di caricamento.

API del servizio: RootObject

Il servizio riguarda i servizi dell'applicazione esposti da un particolare framework o dalle funzionalità di una classe di elementi radice di uso frequente in un framework. Uno scenario per l'acquisizione dell'oggetto radice è la connessione tra code-behind e collegamento di eventi. Ad esempio, l'implementazione di WPF di x:Class viene usata per la compilazione del markup e il collegamento di qualsiasi attributo del gestore eventi che si trova in corrispondenza di qualsiasi altra posizione nel markup XAML. Il punto di connessione delle classi parziali definite da markup e code-behind per- la compilazione di markup si trova in corrispondenza dell'elemento radice.

IXamlNamespaceResolver

Documentazione di riferimento: IXamlNamespaceResolver

Definito da: System.Xaml spazio dei nomi, assembly System.Xaml

Relativo a: percorso di caricamento, percorso di salvataggio.

API del servizio: GetNamespace per il percorso di caricamento, GetNamespacePrefixes per il percorso di salvataggio.

IXamlNamespaceResolver è un servizio che può restituire un identificatore dello spazio dei nomi XAML/URI in base al prefisso corrispondente mappato nel markup XAML di origine.

IProvideValueTarget

Documentazione di riferimento: IProvideValueTarget

Definito da: System.Windows.Markup spazio dei nomi, assembly System.Xaml

Relativo a: percorso di caricamento e percorso di salvataggio.

API del servizio: TargetObject, TargetProperty.

IProvideValueTarget consente a convertitore di tipi o a un'estensione di markup di ottenere il contesto su cui agisce al momento del caricamento. Le implementazioni possono usare questo contesto per invalidare un utilizzo. In alcune estensioni di markup come DynamicResourceExtension, ad esempio, è presente la logica WPF che controlla TargetProperty per garantire che l'estensione venga usata solo per impostare proprietà di dipendenza (o un breve elenco di altre proprietà di non dipendenza).

IXamlNameResolver

Documentazione di riferimento: IXamlNameResolver

Definito da: System.Xaml spazio dei nomi, assembly System.Xaml

Relativo a: definizione di un oggetto grafico del percorso di caricamento, risoluzione di oggetti identificati da x:Name, x:Referenceo tecniche specifiche del framework.

API del servizio: Resolve altre API per scenari più avanzati, ad esempio la gestione dei riferimenti in avanti.

L'implementazione dei servizi XAML .NET per x:Reference la gestione si basa su questo servizio. Framework o strumenti specifici che supportano il framework usano questo servizio per la gestione di x:Name o per la gestione di proprietà (con attributoRuntimeNamePropertyAttribute ) equivalenti.

IDestinationTypeProvider

Documentazione di riferimento: IDestinationTypeProvider

Definito da: System.Xaml spazio dei nomi, assembly System.Xaml

Relativo a: risoluzione del percorso di caricamento di informazioni sul tipo CLR indiretto.

API del servizio: GetDestinationType

Per ulteriori informazioni, vedere IDestinationTypeProvider.

Vedi anche