Contesti di servizio disponibili per convertitori di tipi ed estensioni di markup
Gli autori dei tipi che supportano gli utilizzi di convertitori di tipi ed estensioni di markup devono spesso disporre di informazioni contestuali sulla posizione di utilizzo esistente 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. In caso di utilizzo delle API dei servizi XAML di .NET Framework, il contesto eventualmente necessario viene esposto come 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 utilizzando 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 tipi di servizi. In questo argomento viene illustrato come accedere ai contesti di servizio da un'implementazione del convertitore di valori; vengono inoltre elencati i servizi in genere disponibili e i relativi ruoli.
Nel presente argomento sono contenute le seguenti sezioni.
- Ottenere i servizi
- Servizi per un'estensione di markup
- Servizi per un convertitore di tipi
- Servizi per un serializzatore di valori
- Utilizzo dei contesti di provider di servizi XAML
- Servizi disponibili dal contesto dei servizi XAML di .NET Framework
- Argomenti correlati
Ottenere i servizi
In qualità di implementatore di un convertitore di valori si ha spesso la necessità di disporre dell'accesso a determinati tipo di contesto in cui il convertitore di valori viene applicato. Questo contesto potrebbe includere informazioni quali 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 l'implementazione di un'estensione di markup o di un convertitore di tipi vengono comunicati tramite i parametri di contesto che fanno parte della firma di ogni metodo virtuale. In tutti i casi, si dispone dell'oggetto IServiceProvider implementato nel contesto ed è possibile chiamare IServiceProvider.GetService per richiedere un servizio.
Servizi per un'estensione di markup
MarkupExtension dispone di un solo metodo virtuale, ovvero 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 utilizzano 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 IServiceProvider ed è pertanto 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 utilizza un tipo di provider di servizi specifico della classe ValueSerializer, IValueSerializerContext. Tale contesto viene passato agli override dei quattro metodi virtuali di ValueSerializer. Per ottenere i servizi, chiamare GetService dal contesto.
Utilizzo dei contesti di provider di servizi XAML
Il provider di servizi per l'accesso di GetService ai servizi XAML disponibili per estensioni di markup o convertitori di tipi viene implementato come classe interna, con esposizione solo tramite l'interfaccia e della modalità con cui viene passato nel contesto pertinente. Tutte le volte che un'operazione di elaborazione XAML nelle implementazioni dei servizi XAML di .NET Framework predefinite relative al percorso di caricamento o al percorso di salvataggio richiama i metodi delle estensioni di markup o dei convertitori di tipi pertinenti che necessitano di un contesto del servizio, viene passato questo oggetto interno. 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 è limitata alla richiesta di servizi da tali classi tramite GetService.
Servizi disponibili dal contesto dei servizi XAML di .NET Framework
I servizi XAML di .NET Framework definiscono servizi per estensioni di markup, convertitori di tipi, serializzatori di valori e altri possibili utilizzi. Nelle sezioni seguenti viene descritto ogni servizio e vengono fornite informazioni sulla modalità di utilizzo del servizio in un'implementazione.
IServiceProvider
Documentazione di riferimento: IServiceProvider
Relativo a: utilizzo di base di un'infrastruttura basata su servizi in .NET Framework, in modo che sia possibile chiamare IServiceProvider.GetService.
ITypeDescriptorContext
Documentazione di riferimento: ITypeDescriptorContext
Deriva da IServiceProvider. Questa classe rappresenta il contesto nelle firme TypeConverter standard. TypeConverter è una classe esistente già a partire da .NET Framework versione 1.0 che anticipa XAML e lo scenario TypeConverter XAML per la conversione di tipi da stringa a valore. Nel contesto dei servizi XAML di .NET Framework 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, Instance e PropertyDescriptor restituiscono in genere null dai contesti dei servizi XAML di .NET Framework.
IValueSerializerContext
Documentazione di riferimento: IValueSerializerContext
Deriva da ITypeDescriptorContext e si base inoltre 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: spazio dei nomi System.Windows.Markup, 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 corrispondente al nome di un tipo XAML (XamlType.Name) e restituisce un oggetto Type CLR. 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: spazio dei nomi System.Windows.Markup, 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 l'eventuale radice dell'URI disponibile a livello globale. La radice dell'URI può essere utilizzata per risolvere 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: spazio dei nomi System.Xaml, assembly System.Xaml
Relativo a: gestione del percorso di caricamento e rinvii od ottimizzazioni della ricerca di tipi.
Api del servizio: GetAllAmbientValues, altri 3.
Il concetto di ambiente in XAML è relativo a una tecnica che consente di contrassegnare un particolare membro di un tipo come ambiente. In alternativa, un tipo può costituire un ambiente in modo tale che tutti i valori di proprietà contenenti un'istanza del tipo debbano essere considerati proprietà di ambiente. Le estensioni di markup o i 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 all'istanza del tipo al momento del caricamento oppure utilizzare la conoscenza della struttura di ambiente al momento del salvataggio. Questo 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: spazio dei nomi System.Xaml, 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 ulteriori informazioni sul ruolo del contesto dello schema XAML, vedere Servizi XAML.
IRootObjectProvider
Documentazione di riferimento: IRootObjectProvider
Definito da: spazio dei nomi System.Xaml, 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 degli eventi. Ad esempio, l'implementazione WPF di x:Class viene utilizzata per la compilazione e il collegamento del markup di qualsiasi attributo del gestore eventi trovato in qualsiasi altra posizione nel markup XAML. Il punto di connessione delle classi parziali definite di markup e code-behind per la compilazione di markup si trova in corrispondenza dell'elemento radice.
IXamlNamespaceResolver
Documentazione di riferimento: IXamlNamespaceResolver
Definito da: spazio dei nomi System.Xaml, 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/URI dello spazio dei nomi XAML in base al prefisso corrispondente mappato nel markup XAML di origine.
IProvideValueTarget
Documentazione di riferimento: IProvideValueTarget
Definito da: spazio dei nomi System.Windows.Markup, assembly System.Xaml
Relativo a: percorso di caricamento e percorso di salvataggio.
API del servizio: TargetObject, TargetProperty.
IProvideValueTarget consente a un convertitore di tipi o a un'estensione di markup di ottenere il contesto in cui agisce al momento del caricamento. Questo contesto potrebbe essere utilizzato dalle implementazioni per invalidare un utilizzo. In alcune estensioni di markup di WPF quale DynamicResourceExtension, ad esempio, è presente la logica che controlla TargetProperty per garantire che l'estensione venga utilizzata solo per impostare proprietà di dipendenza (o un breve elenco di altre proprietà di non dipendenza).
IXamlNameResolver
Documentazione di riferimento: IXamlNameResolver
Definito da: spazio dei nomi System.Xaml, assembly System.Xaml
Relativo a: definizione di un oggetto grafico del percorso di caricamento, risoluzione di oggetti identificati da x:Name, x:Reference o tecniche specifiche del framework.
API del servizio: Resolve. Altre API per scenari più avanzati, ad esempio la gestione di riferimenti in avanti.
L'implementazione dei servizi XAML di .NET Framework della gestione di x:Reference si basa su questo servizio. Framework o strumenti specifici che supportano il framework utilizzano questo servizio per la gestione di x:Name o per la gestione di proprietà (con attributo RuntimeNamePropertyAttribute) equivalenti.
IDestinationTypeProvider
Documentazione di riferimento: IDestinationTypeProvider
Definito da: spazio dei nomi System.Xaml, 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.