Tjänstkontexter som är tillgängliga för typkonverterare och markeringstillägg
Författare av de typer som stöder användning av typkonverterare och markeringstillägg måste ofta ha sammanhangsberoende information om var en användning finns i markeringsobjektet eller i den omgivande objektdiagramstrukturen. Information kan behövas så att det angivna objektet instansieras korrekt eller så att objektreferenser till befintliga objekt i objektdiagrammet kan göras. När du använder .NET XAML Services exponeras den kontext som kan krävas som en serie tjänstgränssnitt. Typkonverterare eller stödkod för markeringstillägg kan fråga efter en tjänst med hjälp av en tjänstleverantörskontext som är tillgänglig och skickas via från XamlObjectWriter eller relaterade typer. XAML-schemakontexten är direkt tillgänglig via en sådan tjänst. Det här avsnittet beskriver hur du får åtkomst till tjänstkontexter från en värdekonverterareimplementering och listar vanligtvis tillgängliga tjänster och deras roller.
Skaffa tjänster
Som implementer av en värdekonverterare behöver du ofta åtkomst till någon typ av kontext där värdekonverteraren används. Den här kontexten kan innehålla information som den aktiva XAML-schemakontexten, åtkomst till det typmappningssystem som XAML-schemakontexten och XAML-objektskrivaren tillhandahåller och så vidare. De tjänster som är tillgängliga för ett markeringstillägg eller typkonverterareimplementering kommuniceras via kontextparametrarna som ingår i signaturen för varje virtuell metod. I alla fall har du IServiceProvider implementerat i kontexten och kan anropa IServiceProvider.GetService för att begära en tjänst.
Tjänster för ett tillägg för markering
MarkupExtension har bara en virtuell metod, ProvideValue. Indataparametern serviceProvider
är hur tjänsterna kommuniceras med implementeringar när markeringstillägget anropas av en XAML-processor. Följande pseudokod visar hur en implementering av markeringstillägget kan fråga efter tjänster i dess 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");
}
//...
}
Tjänster för en typkonverterare
TypeConverter har fyra virtuella metoder som använder en tjänstkontext och som stöder XAML-användning. Var och en av dessa metoder skickar en indataparameter context
. Den här parametern är av typen ITypeDescriptorContext, men gränssnittet ärver IServiceProvideroch därför finns det en GetService metod som är tillgänglig för att skriva konverterarimplementeringar.
Följande pseudokod visar hur en typkonverterareimplementering för XAML-användningar kan fråga efter tjänster i en av dess åsidosättningar, i det här fallet 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);
}
Tjänster för en värdeserialiserare
För värde-serialiserarkontext använder du en tjänstprovidertyp som är specifik för klassen ValueSerializerIValueSerializerContext. Den kontexten skickas till åsidosättningar av de fyra ValueSerializer virtuella metoderna. Anropa GetService från kontexten för att hämta tjänster.
Använda XAML-tjänstproviderkontexter
Tjänstleverantören för GetService åtkomst till XAML-tjänster som är tillgängliga för markeringstillägg eller typkonverterare implementeras som en intern klass, med exponering endast via gränssnittet och hur det skickas till relevant kontext. När en XAML-bearbetningsåtgärd i standardimplementeringarna för .NET XAML Services av inläsningssökvägen eller spara-sökvägen anropar relevanta metoder för markeringstillägg eller typkonverterare som kräver en tjänstkontext skickas det här interna objektet. Beroende på omständigheterna tillhandahåller systemtjänstkontexten antingen MarkupExtensionContext
eller TextSyntaxContext
, men detaljerna för båda dessa klasser är interna. Din interaktion med dessa klasser är begränsad till att begära tjänster från dem via GetService.
Tillgängliga tjänster från .NET XAML-tjänstkontexten
.NET XAML Services definierar tjänster för påläggstillägg, typkonverterare, värdeserialiserare och potentiellt andra användningar. Följande avsnitt beskriver var och en av dessa tjänster och ger vägledning om hur tjänsten kan användas i en implementering.
IServiceProvider
Referensdokumentation: IServiceProvider
relevant för: Basic-drift av en tjänstbaserad infrastruktur i .NET så att du kan anropa IServiceProvider.GetService.
ITypeDescriptorContext
Referensdokumentation: ITypeDescriptorContext
Härleds från IServiceProvider. Den här klassen representerar kontexten i standardsignaturerna för TypeConverter. TypeConverter är en klass som har funnits sedan .NET Framework 1.0. Det föregår XAML och XAML-TypeConverter scenariot för konvertering av strängvärdestyp. I .NET XAML Services-kontext implementeras metoder för TypeConverter explicit. Den explicita implementeringens beteende indikerar för anropare att ITypeDescriptorContext-API:et inte är relevant för XAML-typsystem, eller för att läsa eller skriva objekt från XAML.
Container, Instanceoch PropertyDescriptor returnerar vanligtvis null
från .NET XAML Services-kontexter.
IValueSerializerContext
Referensdokumentation: IValueSerializerContext
Härleds från ITypeDescriptorContext och förlitar sig också på explicita implementeringar för att förhindra falska konsekvenser för XAML-typsystemet. Stöder de statiska sökhjälpmetoderna på ValueSerializer.
IXamlTypeResolver
Referensdokumentation: IXamlTypeResolver
definieras av:System.Windows.Markup namnrymd, System.Xaml-sammansättning
relevant för: Scenarier för inläsningssökväg och interaktion med XAML-schemakontext
-tjänst-API:Resolve
Kan påverka mappningen av XAML-till-CLR-typen som krävs när XAML-skrivaren konstruerar ett CLR-objekt i ett objektdiagram. Resolve bearbetar en potentiellt prefixkvalificerad sträng som motsvarar ett XAML-typnamn (XamlType.Name) och returnerar en CLR-Type. Att lösa typer är vanligtvis starkt beroende av XAML-schemakontext. Endast XAML-schemakontexten är medveten om överväganden som vilka sammansättningar som läses in och vilka av dessa sammansättningar som kan eller bör användas för typmatchning.
IUriContext
Referensdokumentation: IUriContext
definieras av:System.Windows.Markup namnrymd, System.Xaml-sammansättning
Relevant för: Läs in sökväg och spara sökvägshantering av medlemsvärden som är URI:er eller x:Uri
värden.
-tjänst-API:BaseUri
Den här tjänsten rapporterar en globalt tillgänglig URI-rot, om någon. URI-roten kan användas för att matcha relativa URI:er till absoluta URI:er eller vice versa. Det här scenariot är huvudsakligen relevant för programtjänster som exponeras av ett visst ramverk eller funktioner i en ofta använd rotelementklass i ett ramverk. Bas-URI:n kan upprättas som en XAML-läsarinställning, som sedan skickas till XAML-objektskrivaren och rapporteras av den här tjänsten.
IAmbientProvider
Referensdokumentation: IAmbientProvider
definieras av:System.Xaml namnrymd, System.Xaml-sammansättning
Relevant för: Belastningssökvägshantering och typuppslagsuppsläckning eller optimeringar.
-tjänst-API:er:GetAllAmbientValues, tre andra.
Atmosfärkonceptet i XAML är en teknik för att markera en viss medlem av en typ som omgivande. En typ kan också vara omgivande så att alla egenskapsvärden som innehåller en instans av typen ska betraktas som omgivande egenskaper. Markeringstillägg eller typkonverterare som ligger längre fram i XAML-nodströmmen och som är underordnade i objektdiagrammet kan komma åt den omgivande egenskapen eller typinstansen vid belastningstillfället. eller så kan de använda kunskap om omgivningsstrukturen vid sparande. Detta kan påverka vilken kvalifikationsgrad som krävs för att lösa typer för andra tjänster, till exempel för IXamlTypeResolver eller för x:Type
. Se även AmbientPropertyValue.
IXamlSchemaContextProvider
Referensdokumentation: IXamlSchemaContextProvider
definieras av:System.Xaml namnrymd, System.Xaml-sammansättning
Relevant för: Inläsningssökväg och alla åtgärder som måste matcha en XAML-typ till en bakgrundstyp.
-tjänst-API:SchemaContext
XAML-schemakontext är nödvändig för alla uppskjutna inläsningsåtgärder, eftersom samma schemakontext måste fungera på det uppskjutna området för att integrera det uppskjutna innehållet. Mer information om rollen för XAML-schemakontexten finns i XAML Services.
IRootObjectProvider
Referensdokumentation: IRootObjectProvider
definieras av:System.Xaml namnrymd, System.Xaml-sammansättning
relevant för: Inläsningssökväg.
-tjänst-API:RootObject
Tjänsten är relevant för programtjänster som exponeras av ett visst ramverk eller av funktioner i en rotelementklass som används ofta i ett ramverk. Ett scenario för att hämta rotobjektet är att ansluta kod bakom och händelsekopplingar. WPF-implementeringen av x:Class
används till exempel för kompilering och kabeldragning av händelsehanterarattribut som finns på någon annan plats i XAML-markering. Anslutningspunkten för markering och kod bakom definierade partiella klasser för markeringskompilering finns i rotelementet.
IXamlNamespaceResolver
Referensdokumentation: IXamlNamespaceResolver
definieras av:System.Xaml namnrymd, System.Xaml-sammansättning
Relevant för: Läs in sökväg, spara sökväg.
Service API:GetNamespace för inläsningssökväg, GetNamespacePrefixes för att spara sökvägen.
IXamlNamespaceResolver är en tjänst som kan returnera en XAML-namnområdesidentifierare/URI baserat på dess prefix som mappats i den ursprungliga XAML-markering.
IProvideValueTarget
Referensdokumentation: IProvideValueTarget
definieras av:System.Windows.Markup namnrymd, System.Xaml-sammansättning
relevant för: Läs in sökväg och spara sökväg.
Service-API:er:TargetObject, TargetProperty.
IProvideValueTarget gör det möjligt för en typkonverterare eller markeringstillägg att hämta kontext om var den agerar vid belastningstillfället. Implementeringar kan använda den här kontexten för att ogiltigförklara en användning. WPF har till exempel logik i några av sina tillägg för markering, till exempel DynamicResourceExtension. Logiken kontrollerar TargetProperty för att se till att tillägget endast används för att ange beroendeegenskaper (eller en kort lista över andra egenskaper som inte är beroende).
IXamlNameResolver
Referensdokumentation: IXamlNameResolver
definieras av:System.Xaml namnrymd, System.Xaml-sammansättning
relevant för: Diagramdefinition för inläsningssökvägsobjekt, matchning av objekt som identifieras av x:Name
, x:Reference
eller ramverksspecifika tekniker.
Service API:er:Resolve; andra API:er för mer avancerade scenarier som att hantera framåtreferenser.
.NET XAML Services-implementeringen av x:Reference
hantering är beroende av den här tjänsten. Specifika ramverk eller verktyg som stöder ramverket använder den här tjänsten för x:Name
hantering eller motsvarande (RuntimeNamePropertyAttribute tillskrev) egenskapshantering.
IDestinationTypeProvider
Referensdokumentation: IDestinationTypeProvider
definieras av:System.Xaml namnrymd, System.Xaml-sammansättning
relevant för: Läsa in sökvägsmatchning av indirekt CLR-typinformation.
-tjänst-API:GetDestinationType
Mer information finns i IDestinationTypeProvider.
Se även
.NET Desktop feedback