Konteksty usług dostępne dla typów konwerterów i rozszerzeń znaczników

Autorzy typów, które obsługują konwerter typów i użycie rozszerzeń znaczników, często muszą mieć kontekstowe informacje o tym, gdzie użycie znajduje się w adiustacji lub w otaczającej strukturze grafu obiektów. Informacje mogą być potrzebne, aby podany obiekt został poprawnie utworzone lub tak, aby można było utworzyć odwołanie do istniejących obiektów w grafie obiektów. W przypadku korzystania z usług XAML platformy .NET kontekst, który może być wymagany, jest uwidoczniony jako szereg interfejsów usług. Kod obsługi konwertera typów lub rozszerzenia znaczników może wysyłać zapytania dotyczące usługi przy użyciu kontekstu dostawcy usług, który jest dostępny i przekazywany z lub XamlObjectWriter powiązanych typów. Kontekst schematu XAML jest dostępny bezpośrednio za pośrednictwem jednej z takich usług. W tym temacie opisano sposób uzyskiwania dostępu do kontekstów usługi z implementacji konwertera wartości oraz listy zazwyczaj dostępnych usług i ich ról.

Uzyskiwanie usług

Jako implementator konwertera wartości często potrzebujesz dostępu do określonego typu kontekstu, w którym jest stosowany konwerter wartości. Ten kontekst może zawierać informacje, takie jak aktywny kontekst schematu XAML, dostęp do systemu mapowania typów, który zapewnia kontekst schematu XAML i składnik zapisywania obiektów XAML itd. Usługi dostępne dla rozszerzenia znaczników lub implementacji konwertera typów są przekazywane za pośrednictwem parametrów kontekstu, które są częścią podpisu każdej metody wirtualnej. W każdym przypadku zaimplementowano IServiceProvider usługę w kontekście i można wywołać IServiceProvider.GetService metodę w celu żądania usługi.

Usługi dla rozszerzenia znaczników

MarkupExtensionma tylko jedną metodę wirtualną. ProvideValue Parametr wejściowy serviceProvider to sposób, w jaki usługi są przekazywane do implementacji, gdy rozszerzenie znaczników jest wywoływane przez procesor XAML. Poniższy pseudokod ilustruje, w jaki sposób implementacja rozszerzenia znaczników może wysyłać zapytania o usługi w pliku 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");
    }
    //...
}

Usługi dla konwertera typów

TypeConverter ma cztery metody wirtualne korzystające z kontekstu usługi i obsługujące użycie języka XAML. Każda z tych metod przekazuje parametr wejściowy context . Ten parametr jest typu ITypeDescriptorContext, ale ten interfejs dziedziczy IServiceProvider, a w związku z tym istnieje GetService metoda dostępna dla implementacji konwertera typów.

Poniższy pseudokod ilustruje, jak implementacja konwertera typów dla użycia XAML może wysyłać zapytania o usługi w jednym z jego przesłonięć, w tym przypadku 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);
}

Usługi dla serializatora wartości

W kontekście serializatora wartości należy użyć typu dostawcy usług, który jest specyficzny dla ValueSerializer klasy . IValueSerializerContext Ten kontekst jest przekazywany do przesłonięć czterech ValueSerializer metod wirtualnych. Wywołaj GetService z kontekstu, aby uzyskać usługi.

Używanie kontekstów dostawcy usług XAML

Dostawca usług w celu GetService uzyskania dostępu do usług XAML dostępnych dla rozszerzeń znaczników lub konwerterów typów jest implementowany jako klasa wewnętrzna, z ekspozycją tylko za pośrednictwem interfejsu i sposobu przekazywania go do odpowiedniego kontekstu. Za każdym razem, gdy operacja przetwarzania XAML platformy .NET w domyślnych implementacjach usług XAML ścieżki ładowania lub ścieżki zapisywania wywołuje odpowiednie metody rozszerzenia znaczników lub konwertera typów, które wymagają kontekstu usługi, ten obiekt wewnętrzny jest przekazywany. W zależności od okoliczności kontekst usługi systemowej zawiera wartość MarkupExtensionContext lub TextSyntaxContext, ale specyfika obu tych klas jest wewnętrzna. Interakcja z tymi klasami jest ograniczona do żądania usług z nich, przez GetService.

Dostępne usługi z kontekstu usługi XAML platformy .NET

Usługi XAML platformy .NET definiują usługi dla rozszerzeń znaczników, konwerterów typów, serializacji wartości i potencjalnie innych użycia. W poniższych sekcjach opisano każdą z tych usług i podano wskazówki dotyczące sposobu użycia usługi w implementacji.

Iserviceprovider

Dokumentacja referencyjna: IServiceProvider

Istotne dla: Podstawowa operacja infrastruktury opartej na usłudze na platformie .NET, aby można było wywołać metodę IServiceProvider.GetService.

Itypedescriptorcontext

Dokumentacja referencyjna: ITypeDescriptorContext

Pochodzi z klasy IServiceProvider. Ta klasa reprezentuje kontekst w podpisach standardowych TypeConverter ; TypeConverter jest klasą, która istniała od programu .NET Framework 1.0. Wstępnie jest to kod XAML i scenariusz XAML TypeConverter na potrzeby konwersji typu ciąg-wartość. W kontekście usług XAML platformy .NET metody TypeConverter są implementowane jawnie. Zachowanie implementacji jawnej wskazuje na wywołania, że ITypeDescriptorContext interfejs API nie jest odpowiedni dla systemów typów XAML lub do odczytywania lub zapisywania obiektów z języka XAML. Container, Instancei PropertyDescriptor zazwyczaj zwracane null z kontekstów usług XAML platformy .NET.

Ivalueserializercontext

Dokumentacja referencyjna: IValueSerializerContext

Pochodzi z ITypeDescriptorContext i opiera się również na jawnych implementacjach, aby pominąć fałszywe implikacje dotyczące systemu typów XAML. Obsługuje statyczne metody pomocnika wyszukiwania w systemie ValueSerializer.

Ixamltyperesolver

Dokumentacja referencyjna: IXamlTypeResolver

Zdefiniowane przez:System.Windows.Markup przestrzeń nazw, zestaw System.Xaml

Istotne dla: Scenariusze ścieżki ładowania i interakcja z kontekstem schematu XAML

Interfejs API usługi:Resolve

Może mieć wpływ na mapowanie typu XAML-to-CLR, które jest konieczne, gdy składnik zapisywania XAML tworzy obiekt CLR na grafie obiektu. Resolve przetwarza potencjalnie kwalifikowany ciąg prefiksu, który odpowiada nazwie typu XAML (XamlType.Name) i zwraca clR Type. Rozpoznawanie typów jest zwykle silnie zależne od kontekstu schematu XAML. Tylko kontekst schematu XAML jest świadomy zagadnień, takich jak, które zestawy są ładowane, i które z tych zestawów mogą lub powinny być dostępne do rozpoznawania typów.

Iuricontext

Dokumentacja referencyjna: IUriContext

Zdefiniowane przez:System.Windows.Markup przestrzeń nazw, zestaw System.Xaml

Istotne dla: Załaduj ścieżkę i zapisz ścieżkę obsługi wartości elementów członkowskich, które są identyfikatorami URI lub x:Uri wartościami.

Interfejs API usługi:BaseUri

Ta usługa zgłasza globalnie dostępny katalog główny identyfikatora URI, jeśli istnieje. Główny identyfikator URI może służyć do rozpoznawania względnych identyfikatorów URI do bezwzględnych identyfikatorów URI lub odwrotnie. Ten scenariusz dotyczy głównie usług aplikacji, które są uwidacznione przez określoną strukturę lub możliwości często używanej klasy elementów głównych w strukturze. Podstawowy identyfikator URI można ustanowić jako ustawienie czytnika XAML, które jest następnie przekazywane do składnika zapisywania obiektów XAML i zgłaszane przez tę usługę.

Iambientprovider

Dokumentacja referencyjna: IAmbientProvider

Zdefiniowane przez:System.Xaml przestrzeń nazw, zestaw System.Xaml

Istotne dla: Obsługa ścieżki ładowania i odroczenie wyszukiwania typów lub optymalizacje.

Interfejsy API usługi:GetAllAmbientValues trzy inne.

Koncepcja atmosfery w XAML jest techniką oznaczania określonego elementu członkowskiego typu jako otoczenia. Alternatywnie typ może być otoczenia, aby wszystkie wartości właściwości, które przechowują wystąpienie typu, powinny być traktowane jako właściwości otoczenia. Rozszerzenia znaczników lub konwertery typów, które są dalej wzdłuż strumienia węzła XAML i które są elementami podrzędnymi na grafie obiektów, mogą uzyskiwać dostęp do właściwości otoczenia lub wystąpienia typu w czasie ładowania; lub mogą korzystać z wiedzy na temat struktury otoczenia w czasie oszczędzenia. Może to mieć wpływ na stopień kwalifikacji, który jest potrzebny do rozpoznawania typów innych usług, takich jak dla IXamlTypeResolver lub dla x:Type. Zobacz też AmbientPropertyValue.

Ixamlschemacontextprovider

Dokumentacja referencyjna: IXamlSchemaContextProvider

Zdefiniowane przez:System.Xaml przestrzeń nazw, zestaw System.Xaml

Istotne dla: Ścieżka ładowania i każda operacja, która musi rozpoznać typ XAML na typ kopii zapasowej.

Interfejs API usługi:SchemaContext

Kontekst schematu XAML jest niezbędny dla wszystkich operacji odroczenia ładowania, ponieważ ten sam kontekst schematu musi działać na odroczonym obszarze w celu zintegrowania odroczonej zawartości. Aby uzyskać więcej informacji na temat roli kontekstu schematu XAML, zobacz Usługi XAML.

Irootobjectprovider

Dokumentacja referencyjna: IRootObjectProvider

Zdefiniowane przez:System.Xaml przestrzeń nazw, zestaw System.Xaml

Istotne dla: Ścieżka ładowania.

Interfejs API usługi:RootObject

Usługa jest odpowiednia dla usług aplikacji, które są uwidacznione przez określoną platformę lub przez możliwości często używanej klasy elementu głównego w strukturze. Jednym ze scenariuszy uzyskiwania obiektu głównego jest łączenie kodu i okablowania zdarzeń. Na przykład implementacja x:Class WPF jest używana do kompilowania znaczników i okablowania dowolnego atrybutu procedury obsługi zdarzeń, który znajduje się na dowolnym innym miejscu w adiustacji XAML. Punkt połączenia znaczników i zdefiniowane za kodem klasy częściowe dla kompilacji znaczników znajduje się w elemecie głównym.

IXamlNamespaceResolver

Dokumentacja referencyjna: IXamlNamespaceResolver

Zdefiniowane przez:System.Xaml przestrzeń nazw, zestaw System.Xaml

Istotne dla: Załaduj ścieżkę, zapisz ścieżkę.

Interfejs API usługi:GetNamespace dla ścieżki ładowania dla GetNamespacePrefixes ścieżki zapisu.

IXamlNamespaceResolver to usługa, która może zwrócić identyfikator /identyfikator URI przestrzeni nazw XAML na podstawie jego prefiksu jako zamapowanego w znaczników XAML pochodzenia.

Iprovidevaluetarget

Dokumentacja referencyjna: IProvideValueTarget

Zdefiniowane przez:System.Windows.Markup przestrzeń nazw, zestaw System.Xaml

Istotne dla: Załaduj ścieżkę i zapisz ścieżkę.

Interfejsy API usługi:TargetObject, TargetProperty.

IProvideValueTarget umożliwia konwerterowi typów lub rozszerzeniu znaczników uzyskiwanie kontekstu o tym, gdzie działa w czasie ładowania. Implementacje mogą używać tego kontekstu do unieważnienia użycia. Na przykład WPF ma logikę wewnątrz niektórych rozszerzeń znaczników, takich jak DynamicResourceExtension. Logika sprawdza TargetProperty właściwość , aby upewnić się, że rozszerzenie jest używane tylko do ustawiania właściwości zależności (lub krótkiej listy innych właściwości innych niż zależności).

Ixamlnameresolver

Dokumentacja referencyjna: IXamlNameResolver

Zdefiniowane przez:System.Xaml przestrzeń nazw, zestaw System.Xaml

Istotne dla: Załaduj definicję grafu obiektu ścieżki, rozpoznawanie obiektów zidentyfikowanych przez x:Nametechniki specyficzne dla platformy lub . x:Reference

Interfejsy API usługi:Resolve; inne interfejsy API dla bardziej zaawansowanych scenariuszy, takich jak obsługa odwołań do przekazywania dalej.

Implementacja x:Reference obsługi usług XAML platformy .NET opiera się na tej usłudze. Określone struktury lub narzędzia, które obsługują platformę, używają tej usługi do x:Name obsługi lub równoważnej (RuntimeNamePropertyAttribute przypisanej) obsługi właściwości.

IDestinationTypeProvider

Dokumentacja referencyjna: IDestinationTypeProvider

Zdefiniowane przez:System.Xaml przestrzeń nazw, zestaw System.Xaml

Istotne dla: ładowanie ścieżki rozpoznawania informacji o typie pośredniego CLR.

Interfejs API usługi:GetDestinationType

W celu uzyskania więcej informacji, zobacz następujący temat: IDestinationTypeProvider.

Zobacz też