Freigeben über


Für Typkonverter und Markuperweiterungen verfügbare Dienstkontexte

Autoren der Typen, die Typ-Konverter und Markuperweiterungsverwendungen erfordern häufig Kontextinformationen dazu, wo sich eine Verwendung im Markup oder in der umgebenden Objektdiagrammstruktur befindet. Informationen können erforderlich sein, damit das bereitgestellte Objekt ordnungsgemäß instanziiert wird oder Objektverweise zu vorhandenen Objekten im Objektdiagramm hergestellt werden können. Wenn Sie .NET XAML Services verwenden, wird der möglicherweise benötigte Kontext durch eine Reihe von Dienstschnittstellen verfügbar gemacht. Der Typkonverter oder der Markuperweiterungsunterstützungscode können eine Abfrage für einen Dienstkontext für Anbieter ausführen, die verfügbar ist und von XamlObjectWriter oder verwandten Typen übergeben wird. Der XAML-Schemakontext ist direkt über einen solchen Dienst verfügbar. In diesem Thema wird beschrieben, wie von einer Wertkonverterimplementierung auf Dienstkontexte zugegriffen werden kann, außerdem werden normalerweise verfügbare Dienste und ihre Rollen aufgeführt.

Abrufen von Diensten

Als Implementierer eines Wertkonverters benötigen Sie häufig Zugriff auf einen Kontexttypen, auf den der Wertkonverter angewendet wird. Dieser Kontext kann möglicherweise Informationen wie z. B. den aktiven XAML-Schemakontext, den vom XAML-Schemakontext und XAML-Objektwriter bereitgestellten Zugriff auf das Typzuordnungssystem usw. umfassen. Die für eine Markuperweiterung oder eine Typenkonverter-Implementierung verfügbaren Dienste werden über die Kontextparameter übermittelt, die Teil der Signatur der einzelnen virtuellen Methoden 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 nur über eine virtuelle Methode, ProvideValue. Der Zweck des serviceProvider -Eingabeparameters besteht darin, zu definieren, wie die Dienste an Implementierungen kommuniziert werden, wenn die Markuperweiterung von einem XAML-Prozessor aufgerufen wird. Der folgende Pseudocode veranschaulicht, wie eine Markuperweiterungsimplementierung Dienste in ProvideValueabfragen kann:

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 XAML-Verwendungen unterstützen. Jede dieser Methoden übergibt einen context -Eingabeparameter. Dieser Parameter ist vom Typ ITypeDescriptorContext, diese Schnittstelle erbt jedoch IServiceProvider, und es ist daher eine GetService -Methode, die für Typkonverterimplementierungen verfügbar sind.

Der folgende Pseudocode veranschaulicht, wie eine Typkonverter-Implementierung für XAML-Verwendungen Dienste in einer seiner Überschreibungen abfragen kann, 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 Diensttyp für Anbieter, der spezifisch für die ValueSerializer -Klasse ist, IValueSerializerContext. Dieser Kontext wird an Überschreibungen der vier ValueSerializer virtuellem Methoden übergeben. Rufen Sie GetService aus dem Kontext auf, um Dienste abzurufen.

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 nur über die Schnittstelle verfügbar gemacht wird und im entsprechenden Kontext übergeben wird. Wenn ein XAML-Verarbeitungsvorgang in den .NET XAML Services-Standardimplementierungen des Lade- oder Speicherpfads das relevante Markup oder die Konvertermethoden aufruft, für die ein Dienstkontext erforderlich ist, wird dieses interne Objekt übergeben. Abhängig von der Situation stellt der Systemdienstkontext entweder MarkupExtensionContext oder TextSyntaxContextbereit, die Einzelheiten dieser beiden Klassen sind jedoch intern. Die Interaktion mit diesen Klassen ist darauf beschränkt, daraus über GetServiceDienste anzufordern.

Verfügbare Dienste aus dem .NET XAML Services-Kontext

.NET XAML Services definiert Dienste für Markuperweiterungen, Typkonverter, Wertserialisierungsprogramme und potenziell andere Verwendungen. In den folgenden Abschnitten wird jeder dieser Dienste beschrieben, und darin ist ein Leitfaden zur Verwendung einer Implementierung enthalten.

IServiceProvider

Referenzdokumentation: IServiceProvider

Relevant für: Grundlegende Vorgänge einer dienstbasierten Infrastruktur in .NET, damit Sie IServiceProvider.GetService aufrufen können.

ITypeDescriptorContext

Referenzdokumentation: ITypeDescriptorContext

Wird von IServiceProviderabgeleitet. Diese Klasse stellt den Kontext in den TypeConverter -Standardsignaturen dar; TypeConverter ist eine Klasse, die seit .NET Framework 1.0 vorhanden ist. Es ist ein Vorläufer des XAML- und XAML- TypeConverter -Szenarios für die Zeichenfolgewert-Typkonvertierung. Im .NET XAML Services-Kontext werden Methoden von TypeConverter explizit implementiert. Das explizite Verhalten der 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 in der Regel null aus den .NET XAML Services-Kontexten zurück.

IValueSerializerContext

Referenzdokumentation: IValueSerializerContext

Leitet sich von ITypeDescriptorContext ab und stützt sich auch auf explizite Implementierungen, um falsche Auswirkungen zum XAML-Typsystem zu unterdrücken. Unterstützt die statischen Nachschlage-Hilfsmethoden unter ValueSerializer.

IXamlTypeResolver

Referenzdokumentation: IXamlTypeResolver

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

Relevant für: Ladepfad-Szenarios sowie 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 potenziell durch ein Präfix qualifizierte Zeichenfolge, die einem XAML-Typnamen (XamlType.Name) entspricht, und gibt eine CLR Typezurück. Das Auflösen von Typen hängt in der Regel stark vom XAML-Schemakontext ab. Nur der XAML-Schemakontext beachtet Überlegungen wie z. B. welche Assemblys geladen werden und auf welche dieser Assemblys zur Typauflösung zugegriffen werden soll.

IUriContext

Referenzdokumentation: IUriContext

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

Relevant für: Verarbeitung des Ladepfads und Speicherpfads von Elementwerten, bei denen es sich um URIs oder x:Uri -Werte handelt.

Dienst-API: BaseUri

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

IAmbientProvider

Referenzdokumentation: IAmbientProvider

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

Relevant für: Verarbeitung des Ladepfads und Typsuchen- Verzögerungen oder Optimierungen.

Dienst-APIs: GetAllAmbientValues, drei weitere.

Das Umgebungskonzept in XAML ist eine Technik zum Kennzeichnen eines bestimmten Elements eines Typs als Umgebung. Alternativ kann ein Typ eine Umgebung sein, damit alle Eigenschaftswerte, die eine Instanz des Typs enthält, die als Umgebungseigenschaften berücksichtigt werden soll. Markuperweiterungen oder Typkonverter, die sich weiter unten im XAML-Knotenstream befinden und Nachfolger im Objektdiagramm sind, können zur Ladezeit auf die Umgebungseigenschaft oder Typinstanz zugreifen; oder sie können Kenntnisse der Umgebungsstruktur zur Speicherzeit verwenden. Dies kann den Grad der Qualifizierung beeinflussen, der zum Auflösen von Typen für andere Dienste erforderlich ist, wie 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 Vorgänge, die einen XAML-Typ in einen Unterstützungstyp auflösen müssen.

Dienst-API: SchemaContext

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

IRootObjectProvider

Referenzdokumentation: IRootObjectProvider

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

Relevant für: Ladepfad.

Dienst-API: RootObject

Der Dienst ist für Anwendungsdienste relevant, die von einem bestimmten Framework oder Funktionen einer häufig verwendeten Stammelementklasse in einem Framework verfügbar gemacht werden. Ein Szenario zum Abrufen des Stammobjekts ist das Verknüpfen von CodeBehind und Ereignisverbindungen. Angenommen, die WPF-Implementierung von x:Class dient für die Markupkompilierung und das Verknüpfen eines Ereignishandler-Attributs, das an einer beliebigen anderen Position im XAML-Markup gefunden wird. Der Verbindungspunkt von Markup und CodeBehind definiert Teilklassen für die Markupkompilierung im Stammelement.

IXamlNamespaceResolver

Referenzdokumentation: IXamlNamespaceResolver

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

Relevant für: Ladepfad, Speicherpfad.

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

IXamlNamespaceResolver ist ein Dienst, der einen XAML-Namespacebezeichner zurückgeben kann/URI basierend auf dem Präfix, wie in dem ursprünglichen XAML-Markup zugeordnet.

IProvideValueTarget

Referenzdokumentation: IProvideValueTarget

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

Relevant für: Ladepfad und Speicherpfad.

Dienst-APIs: TargetObject, TargetProperty.

MitIProvideValueTarget kann ein Typkonverter oder die Markuperweiterung den Kontext dazu abrufen, wo sie zur Ladezeit fungieren. Implementierungen könnten diesen Kontext verwenden, um eine Verwendung ungültig zu machen. WPF verfügt innerhalb einiger der Markuperweiterungen wie z. B. DynamicResourceExtensionüber eine Logik. Die Logik überprüft die TargetProperty , um sicherzustellen, dass die Erweiterung nur zum Festlegen von Abhängigkeitseigenschaften (oder eine kurze Liste mit anderen Eigenschaften ohne Abhängigkeiten) verwendet wird.

IXamlNameResolver

Referenzdokumentation: IXamlNameResolver

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

Relevant für: Definition des Ladepfadobjektdiagramms, Auflösen von durch x:Name, x:Referenceoder Framework-spezifischen Techniken identifizierten Objekten.

Dienst-APIs: Resolve; andere APIs für erweiterte Szenarien, z. B. den Umgang mit Vorwärtsverweisen.

Die .NET XAML Services-Implementierung der x:Reference-Behandlung beruht auf diesem Dienst. Bestimmte Frameworks oder Tools, die die Frameworknutzung dieses Diensts für die x:Name -Verarbeitung oder entsprechende (RuntimeNamePropertyAttribute attributierte)-Eigenschaftsverarbeitung unterstützen.

IDestinationTypeProvider

Referenzdokumentation: IDestinationTypeProvider

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

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

Dienst-API: GetDestinationType

Weitere Informationen finden Sie unter IDestinationTypeProvider.

Siehe auch