Freigeben über


Für Typkonverter und Markuperweiterungen verfügbare Dienstkontexte

Autoren der Typen, die Typkonverter- und Markuperweiterungssyntaxen unterstützen, benötigen häufig Kontextinformationen dazu, wo sich eine Syntax im Markup oder in der umgebenden Objektdiagrammstruktur befindet. Informationen können erforderlich sein, damit das bereitgestellte Objekt korrekt instanziiert wird oder Objektverweise auf vorhandene Objekte im Objektdiagramm hergestellt werden können. Bei der Verwendung von .NET Framework-XAML-Diensten wird der möglicherweise erforderliche Kontext durch eine Reihe von Dienstschnittstellen verfügbar gemacht. Unterstützungscode für Typkonverter oder Markuperweiterungen kann mit einem verfügbaren Dienstanbieterkontext, der von XamlObjectWriter oder verwandten Typen übergeben wird, einen Dienst abfragen. Der XAML-Schemakontext ist direkt über einen solchen Dienst verfügbar. In diesem Thema wird beschrieben, wie auf Dienstkontexte von einer Wertkonverterimplementierung zugegriffen wird, und es werden die normalerweise verfügbaren Dienste und ihre Rollen aufgeführt.

Dieses Thema enthält folgende Abschnitte.

  • Erhalten von Diensten
  • Dienste für eine Markuperweiterung
  • Dienste für einen Typkonverter
  • Dienste für ein Wertserialisierungsprogramm
  • Verwenden der XAML-Dienstanbieterkontexte
  • Verfügbare Dienste im .NET Framework-XAML-Dienst-Kontext
  • Verwandte Abschnitte

Erhalten von Diensten

Als die Implementierer eines Wertkonverters benötigen Sie häufig Zugriff auf einen Kontexttyp, in dem der Wertkonverter angewendet wird. Dieser Kontext könnte Informationen umfassen, wie z. B. den aktiven XAML-Schemakontext, Zugriff auf das Typzuordnungssystem, den der XAML-Schemakontext und XAML-Objektwriter bereitstellen usw. Die für eine Markuperweiterungs- oder Typkonverterimplementierung verfügbaren Dienste werden durch die Kontextparameter übermittelt, die Teil der Signatur jeder virtuellen Methode sind. In jedem Fall haben Sie IServiceProvider im Kontext implementiert und können IServiceProvider.GetService aufrufen, um einen Dienst anzufordern.

Dienste für eine Markuperweiterung

MarkupExtension verfügt über nur eine virtuelle Methode, ProvideValue. Der serviceProvider-Eingabeparameter gibt an, wie Implementierungen die Dienste mitgeteilt werden, wenn die Markuperweiterung von einem XAML-Prozessor aufgerufen wird. Der folgende Pseudocode veranschaulicht, wie eine Markuperweiterungsimplementierung Dienste in ihrem ProvideValue abfragen könnte:

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"));
    }
...
}

Dienste für einen Typkonverter

TypeConverter verfügt über vier virtuelle Methoden, die einen Dienstkontext verwenden und die XAML-Verwendungen unterstützen. Jede dieser Methoden übergibt einen context-Eingabeparameter. Dieser Parameter ist vom Typ ITypeDescriptorContext, die Schnittstelle erbt jedoch IServiceProvider, und deshalb ist eine GetService-Methode für Typkonverterimplementierungen verfügbar.

Der folgende Pseudocode veranschaulicht, wie eine Typkonverterimplementierung für XAML-Verwendungen Dienste in einer seiner Überschreibungen abfragen könnte, in diesem Fall 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);
}

Dienste für ein Wertserialisierungsprogramm

Für den Wertserialisierungsprogrammkontext verwenden Sie einen Dienstanbietertyp, der spezifisch für die ValueSerializer-Klasse, IValueSerializerContext, ist. Dieser Kontext wird an Überschreibungen der vier virtuellen ValueSerializer-Methoden übergeben. Rufen Sie GetService aus dem Kontext auf, um Dienste zu erhalten.

Verwenden der XAML-Dienstanbieterkontexte

Der Dienstanbieter für den GetService-Zugriff auf XAML-Dienste, die für Markuperweiterungen oder Typkonverter verfügbar sind, wird als interne Klasse implementiert. Die Bereitstellung erfolgt nur über die Schnittstelle und die Art und Weise der Übergabe in den relevanten Kontext. Jedes Mal, wenn ein XAML-Verarbeitungvorgang in den .NET Framework-XAML-Dienst-Standardimplementierungen des Lade- oder Speicherpfads die relevanten Markuperweiterungs- oder Typkonvertermethoden aufruft, die einen Dienstkontext erfordern, wird dieses interne Objekt übergeben. Je nach Umstand stellt der Systemdienstkontext MarkupExtensionContext oder TextSyntaxContext bereit, die Einzelheiten dieser beiden Klassen sind jedoch intern. Die Interaktion mit diesen Klassen ist auf das Anfordern von Diensten über GetService beschränkt.

Verfügbare Dienste im .NET Framework-XAML-Dienst-Kontext

.NET Framework-XAML-Dienste definieren Dienste für Markuperweiterungen, Typkonverter, Wertserialisierungsprogramme und mögliche andere Verwendungen. In den folgenden Abschnitten wird jeder dieser Dienste beschrieben, und es werden Anweisungen dazu bereitgestellt, wie der Dienst in einer Implementierung verwendet werden kann.

IServiceProvider

Referenzdokumentation: IServiceProvider

Betrifft: Grundlegender Vorgang einer dienstbasierten Infrastruktur in .NET Framework, damit Sie IServiceProvider.GetService aufrufen können

ITypeDescriptorContext

Referenzdokumentation: ITypeDescriptorContext

Wird von IServiceProvider abgeleitet. Diese Klasse stellt den Kontext in den TypeConverter-Standardsignaturen dar. TypeConverter ist eine Klasse, die seit .NET Framework, Version 1.0 verfügbar ist. Sie wurde somit vor XAML und dem XAML-TypeConverter-Szenario für die Zeichenfolgen-Werttypkonvertierung verwendet. Im .NET Framework-XAML-Dienst-Kontext werden Methoden von TypeConverter explizit implementiert. Das Verhalten der expliziten Implementierung gibt Aufrufern an, dass die ITypeDescriptorContext-API für XAML-Typsysteme oder zum Lesen oder Schreiben von Objekten aus XAML nicht relevant ist. Container, Instance und PropertyDescriptor geben normalerweise null von .NET Framework-XAML-Dienst-Kontexten zurück.

IValueSerializerContext

Referenzdokumentation: IValueSerializerContext

Ist von ITypeDescriptorContext abgeleitet und stützt sich auch auf explizite Implementierungen, um falsche Auswirkungen im Zusammenhang mit dem XAML-Typsystem zu unterdrücken. Unterstützt die statischen Methoden des Suchhilfsprogramms in ValueSerializer.

IXamlTypeResolver

Referenzdokumentation: IXamlTypeResolver

Definiert durch: System.Windows.Markup-Namespace, System.Xaml-Assembly

Relevant für: Ladepfadszenarios und die Interaktion mit dem XAML-Schemakontext

Dienst-API: Resolve

Kann die XAML-zu-CLR-Typzuordnung beeinflussen, die erforderlich ist, wenn der XAML-Writer ein CLR-Objekt in einem Objektdiagramm erstellt. Resolve verarbeitet eine möglicherweise durch ein Präfix qualifzierte Zeichenfolge, die einem XAML-Typnamen (XamlType.Name) entspricht, und gibt einen CLR-Type zurück. Die Auflösung von Typen ist in der Regel in hohem Maße vom XAML-Schemakontext abhängig. Nur der XAML-Schemakontext beachtet Überlegungen, z. B. im Hinblick darauf, welche Assemblys geladen sind und auf welche dieser Assemblys für die Typauflösung zugegriffen werden kann und sollte.

IUriContext

Referenzdokumentation: IUriContext

Definiert durch: System.Windows.Markup-Namespace, System.Xaml-Assembly

Betrifft: Ladepfad- und Speicherpfadverarbeitung von Memberwerten, die URIs oder x:Uri-Werte sind

Dienst-API: BaseUri

Dieser Dienst meldet einen global verfügbaren URI-Stamm, falls vorhanden. Der URI-Stamm kann verwendet werden, um relative URIs in absolute URIs aufzulösen oder umgekehrt. Dieses Szenario ist vor allem für Anwendungsdienste, die von einem bestimmten Framework oder von Funktionen einer häufig verwendeten Stammelementklasse in einem Framework verfügbar gemacht werden, relevant. Der Basis-URI kann als XAML-Readereinstellung festgelegt werden, die anschließend an den XAML-Objektwriter übergeben und von diesem Dienst gemeldet wird.

IAmbientProvider

Referenzdokumentation: IAmbientProvider

Definiert durch: System.Xaml-Namespace, System.Xaml-Assembly

Relevant für: Ladepfadverarbeitung und Verzögerungen oder Optimierungen der Typsuche.

Dienst-APIs: GetAllAmbientValues, 3 weitere

Das Umgebungskonzept in XAML ist eine Technik zum Kennzeichnen eines bestimmten Members eines Typs als Ambient. Alternativ kann ein Typ auch insofern "Ambient" sein, als alle Eigenschaftswerte, die eine Instanz des Typs enthalten, als Ambient-Eigenschaften betrachtet werden sollen. Markuperweiterungen oder Typkonverter, die sich weiter unten im XAML-Knotenstream befinden und Nachfolger im Objektdiagramm sind, können zur Ladezeit auf die Ambient-Eigenschaft oder Typinstanz zugreifen oder Wissen zur Ambient-Struktur zur Speicherzeit verwenden. Dies kann sich auf den Grad der Qualifizierung auswirken, die erforderlich ist, um Typen für andere Dienste aufzulösen, z. B. für IXamlTypeResolver oder x:Type. Siehe auch AmbientPropertyValue.

IXamlSchemaContextProvider

Referenzdokumentation: IXamlSchemaContextProvider

Definiert durch: System.Xaml-Namespace, System.Xaml-Assembly

Relevant für: Ladepfad und jeden Vorgang, der einen XAML-Typ in einen Unterstützungstyp auflösen muss.

Dienst-API: SchemaContext

Der XAML-Schemakontext ist für alle Vorgänge zur Ladeverzögerung erforderlich, da derselbe Schemakontext auf dem verzögerten Bereich angewendet werden muss, um den verzögerten Inhalt zu integrieren. Weitere Informationen zur Rolle des XAML-Schemakontexts finden Sie unter XAML-Dienste.

IRootObjectProvider

Referenzdokumentation: IRootObjectProvider

Definiert durch: System.Xaml-Namespace, System.Xaml-Assembly

Relevant für: Ladepfad.

Dienst-API: RootObject

Der Dienst ist vor allem für Anwendungsdienste, die von einem bestimmten Framework oder von Funktionen einer häufig verwendeten Stammelementklasse in einem Framework verfügbar gemacht werden, relevant. Ein Szenario zum Erhalten des Stammobjekts verbindet Code-Behind und die Ereignisverknüpfung. Die WPF-Implementierung von x:Class wird z. B. für die Markupkompilierung und die Verknüpfung eines beliebigen Ereignishandlerattributs verwendet, das an einer beliebigen anderen Position im XAML-Markup vorkommt. Der Verbindungspunkt von Markup und partiellen Klassen mit definiertem Code-Behind für die Markupkompiliierung ist das Stammelement.

IXamlNamespaceResolver

Referenzdokumentation: IXamlNamespaceResolver

Definiert durch: System.Xaml-Namespace, System.Xaml-Assembly

Relevant für: Ladepfad, Speicherpfad.

Dienst-API: GetNamespace für Ladepfad, GetNamespacePrefixes für Speicherpfad.

IXamlNamespaceResolver ist ein Dienst, der anhand des im ursprünglichen XAML-Markup zugeordneten Präfixes einen XAML-Namespacebezeichner/URI zurückgeben kann.

IProvideValueTarget

Referenzdokumentation: IProvideValueTarget

Definiert durch: System.Windows.Markup-Namespace, System.Xaml-Assembly

Relevant für: Ladepfad und Speicherpfad.

Dienst-APIs: TargetObject, TargetProperty

IProvideValueTarget ermöglicht es einem Typkonverter oder einer Markuperweiterung, Kontext dazu abzurufen, wo er bzw. sie zur Ladezeit eingesetzt wird. Implementierungen könnten diesen Kontext verwenden, um eine Verwendung ungültig zu machen. WPF verfügt z. B. in einigen seiner Markuperweiterungen über Logik, z. B. DynamicResourceExtension. Die Logik überprüft die TargetProperty-Eigenschaft, um sicherzustellen, dass die Erweiterung nur zum Festlegen von Abhängigkeitseigenschaften (oder einer kurzen Liste anderer Nicht-Abhängigkeitseigenschaften) verwendet wird.

IXamlNameResolver

Referenzdokumentation: IXamlNameResolver

Definiert durch: System.Xaml-Namespace, System.Xaml-Assembly

Relevant für: Definition des Ladepfadobjektdiagramms, beim Auflösen von durch x:Name, x:Reference oder frameworkspezifische Techniken identifizierten Objekten.

Dienst-APIs: Resolve, andere APIs für erweiterte Szenarien, z. B. die Behandlung von Vorwärtsverweisen.

Die .NET Framework-XAML-Dienst-Implementierung der x:Reference-Behandlung beruht auf diesem Dienst. Bestimmte Frameworks oder Tools, die das Framework unterstützen, verwenden diesen Dienst für die x:Name-Verarbeitung oder entsprechende (attributiertes RuntimeNamePropertyAttribute) Eigenschaftenverarbeitung.

IDestinationTypeProvider

Referenzdokumentation: IDestinationTypeProvider

Definiert durch: System.Xaml-Namespace, System.Xaml-Assembly

Relevant für: Ladepfadauflösung indirekter CLR-Typinformationen.

Dienst-API:GetDestinationType

Weitere Informationen finden Sie unter IDestinationTypeProvider.

Siehe auch

Referenz

MarkupExtension

XamlObjectWriter

Weitere Ressourcen

Übersicht über Markuperweiterungen für XAML

Übersicht über Typkonverter für XAML