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.