Kontexty služby dostupné pro převaděče typů a rozšíření značek

Autoři typů, které podporují použití převaděče typů a rozšíření značek, musí často obsahovat kontextové informace o tom, kde se využití nachází v kódu nebo v okolní struktuře grafu objektů. Můžou být potřeba informace, aby byl poskytnutý objekt správně vytvořený nebo aby bylo možné vytvořit odkazy na existující objekty v grafu objektů. Při použití služeb .NET XAML je kontext, který může být vyžadován, zpřístupněn jako řada rozhraní služeb. Kód podpory rozšíření typů nebo rozšíření značek se může dotazovat na službu pomocí kontextu poskytovatele služeb, který je k dispozici a předán z XamlObjectWriter nebo souvisejících typů. Kontext schématu XAML je přímo dostupný prostřednictvím jedné takové služby. Toto téma popisuje, jak přistupovat k kontextům služby z implementace převaděče hodnot a uvádí obvykle dostupné služby a jejich role.

Získávání služeb

Jako implementátor převaděče hodnot často potřebujete přístup k určitému typu kontextu, ve kterém je použit převaděč hodnot. Tento kontext může obsahovat informace, jako je aktivní kontext schématu XAML, přístup k systému mapování typů, který poskytuje kontext schématu XAML a zapisovač objektů XAML atd. Služby dostupné pro rozšíření značek nebo implementaci převaděče typů jsou komunikovány prostřednictvím kontextových parametrů, které jsou součástí podpisu každé virtuální metody. V každém případě jste implementovali IServiceProvider v kontextu a můžete volat IServiceProvider.GetService žádost o službu.

Služby pro rozšíření značek

MarkupExtensionmá pouze jednu virtuální metodu. ProvideValue serviceProvider Vstupní parametr je způsob, jakým se služby předávají implementacím, když je rozšíření značek volána procesorem XAML. Následující pseudokód znázorňuje, jak se implementace rozšíření značek může dotazovat na služby v jeho 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");
    }
    //...
}

Služby pro převaděč typů

TypeConverter má čtyři virtuální metody, které používají kontext služby a podporují použití XAML. Každá z těchto metod předává vstupní context parametr. Tento parametr je typu ITypeDescriptorContext, ale toto rozhraní dědí IServiceProvider, a proto je GetService k dispozici metoda pro implementace převaděče typů.

Následující pseudokód znázorňuje, jak implementace převaděče typů pro použití XAML může dotazovat na služby v jednom z jeho přepsání, v tomto případě 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);
}

Služby serializátoru hodnot

Pro kontext serializátoru hodnot použijte typ poskytovatele služby, který je specifický pro ValueSerializer třídu, IValueSerializerContext. Tento kontext se předává přepsání čtyř ValueSerializer virtuálních metod. Volání GetService z kontextu pro získání služeb

Použití kontextů zprostředkovatele služeb XAML

Poskytovatel služeb pro GetService přístup ke službám XAML dostupným pro rozšíření značek nebo převaděčů typů se implementuje jako interní třída s expozicí pouze prostřednictvím rozhraní a způsobu jeho předání do relevantního kontextu. Pokaždé, když operace zpracování XAML ve výchozích implementacích .NET XAML Services cesty načtení nebo cesty k uložení vyvolá příslušné metody rozšíření značek nebo převaděče typů, které vyžadují kontext služby, tento interní objekt se předá. V závislosti na okolnostech poskytuje kontext systémové služby buď MarkupExtensionContext nebo TextSyntaxContext, ale specifika obou těchto tříd jsou interní. Vaše interakce s těmito třídami je omezena na vyžádání služeb od nich prostřednictvím GetService.

Dostupné služby z kontextu služby .NET XAML

Služba .NET XAML Services definuje služby pro rozšíření značek, převaděče typů, serializátory hodnot a potenciálně další použití. Následující části popisují každou z těchto služeb a poskytují pokyny k použití služby v implementaci.

Iserviceprovider

Referenční dokumentace: IServiceProvider

Relevantní pro: Základní provoz infrastruktury založené na službě v rozhraní .NET, abyste mohli volat IServiceProvider.GetService.

Itypedescriptorcontext

Referenční dokumentace: ITypeDescriptorContext

Odvozuje z IServiceProvider. Tato třída představuje kontext ve standardních TypeConverter podpisech; TypeConverter je třída, která existuje od rozhraní .NET Framework 1.0. Předveduje XAML a scénář XAML TypeConverter pro převod typu řetězcová hodnota. V kontextu služeb XAML .NET jsou metody TypeConverter implementovány explicitně. Explicitní chování implementace označuje volajícím, že ITypeDescriptorContext rozhraní API není relevantní pro systémy typů XAML nebo pro čtení nebo zápis objektů z XAML. Container, Instancea PropertyDescriptor obecně se vrací null z kontextů služeb XAML .NET.

IValueSerializerContext

Referenční dokumentace: IValueSerializerContext

Odvozuje a ITypeDescriptorContext také spoléhá na explicitní implementace, které potlačí nepravdivé důsledky pro systém typů XAML. Podporuje pomocné metody statického vyhledávání .ValueSerializer

IXamlTypeResolver

Referenční dokumentace: IXamlTypeResolver

Definováno:System.Windows.Markup obor názvů, sestavení System.Xaml

Relevantní pro: Scénáře načtení cesty a interakce s kontextem schématu XAML

Rozhraní API služby:Resolve

Může ovlivnit mapování typu XAML-to-CLR, které je nezbytné, když zapisovač XAML vytvoří objekt CLR v grafu objektu. Resolve zpracuje potenciálně kvalifikovaný řetězec s předponou, který odpovídá názvu typu XAML (XamlType.Name) a vrátí CLR Type. Překlad typů je obvykle silně závislý na kontextu schématu XAML. Pouze kontext schématu XAML je si vědom aspektů, jako jsou načtení sestavení a které z těchto sestavení mohou nebo by měly být přístupné pro překlad typů.

IUriContext

Referenční dokumentace: IUriContext

Definováno:System.Windows.Markup obor názvů, sestavení System.Xaml

Relevantní pro: Načtení cesty a uložení cesty zpracování hodnot členů, které jsou identifikátory URI nebo x:Uri hodnoty.

Rozhraní API služby:BaseUri

Tato služba hlásí globálně dostupný kořenový adresář identifikátoru URI, pokud existuje. Kořen identifikátoru URI lze použít k překladu relativních identifikátorů URI na absolutní identifikátory URI nebo naopak. Tento scénář je relevantní hlavně pro aplikační služby, které jsou vystaveny konkrétní architekturou, nebo schopností často používané třídy kořenových elementů v rámci architektury. Základní identifikátor URI lze navázat jako nastavení čtečky XAML, které se pak předává zapisovači objektů XAML a hlášeno touto službou.

IAmbientProvider

Referenční dokumentace: IAmbientProvider

Definováno:System.Xaml obor názvů, sestavení System.Xaml

Relevantní pro: Zpracování cest načítání a odložení vyhledávání typů nebo optimalizace.

Rozhraní API služby:GetAllAmbientValues tři další.

Koncept atmosféry v XAML je technika pro označení určitého člena typu jako okolí. Případně může být typ okolí, aby všechny hodnoty vlastností, které obsahují instanci typu, měly být považovány za okolní vlastnosti. Rozšíření značek nebo převaděče typů, které jsou dále podél datového proudu uzlu XAML a které jsou potomky v grafu objektu mohou přistupovat k okolní vlastnosti nebo instanci typu v době načtení; nebo mohou využívat znalosti okolí struktury v době úspory. To může mít vliv na stupeň kvalifikace, který je nutný k vyřešení typů pro jiné služby, například pro IXamlTypeResolver nebo pro x:Type. Viz také AmbientPropertyValue.

Ixamlschemacontextprovider

Referenční dokumentace: IXamlSchemaContextProvider

Definováno:System.Xaml obor názvů, sestavení System.Xaml

Relevantní pro: Načíst cestu a všechny operace, které musí přeložit typ XAML na záložní typ.

Rozhraní API služby:SchemaContext

Kontext schématu XAML je nezbytný pro všechny operace odložení zatížení, protože stejný kontext schématu musí reagovat na odloženou oblast, aby bylo možné integrovat odložený obsah. Další informace o roli kontextu schématu XAML naleznete v tématu Služby XAML.

IRootObjectProvider

Referenční dokumentace: IRootObjectProvider

Definováno:System.Xaml obor názvů, sestavení System.Xaml

Relevantní pro: Načíst cestu.

Rozhraní API služby:RootObject

Služba je relevantní pro aplikační služby, které jsou vystaveny konkrétní architekturou nebo schopností často používané třídy kořenových elementů v rámci. Jedním ze scénářů pro získání kořenového objektu je připojení zakódování a zapojení událostí. Například WPF implementace x:Class se používá pro kompilaci značek a zapojení jakéhokoli atributu obslužné rutiny události, který se nachází na libovolné jiné pozici v kódu XAML. Spojovací bod značek a kódu za definovanými částečnými třídami pro kompilaci značek je v kořenovém prvku.

IXamlNamespaceResolver

Referenční dokumentace: IXamlNamespaceResolver

Definováno:System.Xaml obor názvů, sestavení System.Xaml

Relevantní pro: Načíst cestu, uložit cestu.

Rozhraní API služby:GetNamespace pro cestu GetNamespacePrefixes načtení pro cestu uložení.

IXamlNamespaceResolver je služba, která může vrátit identifikátor oboru názvů XAML / identifikátor URI na základě jeho předpony, jak je namapováno ve zdrojovém kódu XAML.

Iprovidevaluetarget

Referenční dokumentace: IProvideValueTarget

Definováno:System.Windows.Markup obor názvů, sestavení System.Xaml

Relevantní pro: Načtěte cestu a uložte cestu.

Rozhraní API služby:TargetObject, TargetProperty.

IProvideValueTarget umožňuje převaděč typů nebo rozšíření značek získat kontext o tom, kde funguje při načítání. Implementace můžou tento kontext použít k zneplatnění použití. Například WPF má logiku uvnitř některé z jeho rozšíření značek, jako DynamicResourceExtensionje například . Logika zkontroluje TargetProperty , jestli se rozšíření používá pouze k nastavení vlastností závislosti (nebo krátkého seznamu dalších vlastností, které nejsou závislé).

IXamlNameResolver

Referenční dokumentace: IXamlNameResolver

Definováno:System.Xaml obor názvů, sestavení System.Xaml

Relevantní pro: Načtení definice grafu objektu cesty, překlad objektů identifikovaných x:Namepomocí , x:Referencenebo technik specifických pro architekturu.

Rozhraní API služeb:Resolve; další rozhraní API pro pokročilejší scénáře, jako je například práce s předávanými odkazy.

Implementace x:Reference služby .NET XAML Services spoléhá na tuto službu. Konkrétní architektury nebo nástroje, které podporují architekturu, používají tuto službu pro x:Name zpracování nebo ekvivalentní zpracování vlastností (RuntimeNamePropertyAttribute atributu).

IDestinationTypeProvider

Referenční dokumentace: IDestinationTypeProvider

Definováno:System.Xaml obor názvů, sestavení System.Xaml

Relevantní pro: Načtení řešení cesty nepřímých informací o typu CLR.

Rozhraní API služby:GetDestinationType

Další informace najdete na webu IDestinationTypeProvider.

Viz také