Domyślny kontekst schematu XAML i kontekst schematu WPF XAML

Kontekst schematu XAML to jednostka koncepcyjna, która kwalifikuje się do sposobu, w jaki produkcja XAML używająca określonego słownictwa XAML współdziała z zachowaniem zapisywania obiektów, w tym sposobem rozpoznawania mapowania typów, sposobu ładowania zestawów, interpretowania niektórych ustawień czytnika i zapisywania. W tym temacie opisano funkcje usług XAML platformy .NET i skojarzony domyślny kontekst schematu XAML, który jest oparty na systemie typów CLR. W tym temacie opisano również kontekst schematu XAML, który jest używany dla WPF.

Domyślny kontekst schematu XAML

Usługi XAML platformy .NET implementują i używają domyślnego kontekstu schematu XAML. Domyślne zachowanie kontekstu schematu XAML nie zawsze jest w pełni widoczne w interfejsie API XamlSchemaContext klasy. Jednak w wielu przypadkach zachowanie domyślnego kontekstu schematu XAML jest zauważalne za pośrednictwem wspólnego interfejsu API systemu typów XAML, takich jak elementy członkowskie XamlMember lub XamlType, lub za pośrednictwem interfejsów API uwidocznionych na czytnikach XAML i składnikach zapisywania XAML, które używają domyślnego kontekstu schematu XAML.

Można utworzyć hermetyzację XamlSchemaContext domyślnego zachowania przez wywołanie konstruktora XamlSchemaContext . Spowoduje to jawne utworzenie domyślnego kontekstu schematu XAML. Ten sam domyślny kontekst schematu XAML jest tworzony niejawnie, jeśli inicjujesz czytnik XAML lub składnik zapisywania XAML przy użyciu interfejsów API, które nie jawnie przyjmują parametru wejściowego XamlSchemaContext .

Domyślny kontekst schematu XAML opiera się na odbiciu CLR dla zachowania mapowania typów. Obejmuje to badanie definiowania środowiska CLR Typei powiązanych PropertyInfo lub MethodInfo. Ponadto atrybut CLR dla typów lub elementów członkowskich jest używany w celu wypełnienia szczegółowych informacji dotyczących typu XAML lub elementu członkowskiego XAML, które używają typu kopii zapasowej CLR. Domyślny kontekst schematu XAML nie wymaga technik rozszerzenia systemu typów, takich jak Invoker wzorzec, ponieważ niezbędne informacje są dostępne w systemie typów CLR.

W przypadku logiki ładowania zestawu domyślny kontekst schematu XAML opiera się głównie na wszystkich wartościach zestawów dostępnych w mapowaniach przestrzeni nazw XAML. Ponadto może zasugerować ładowanie zestawu w scenariuszach, LocalAssembly takich jak ładowanie typów wewnętrznych.

Kontekst schematu XAML WPF

Kontekst schematu WPF XAML jest opisany w tym temacie, ponieważ implementacja WPF zawiera interesującą ilustrację rodzajów funkcji, które można wprowadzić przez zaimplementowanie nie domyślnego kontekstu schematu XAML. Ponadto koncepcja kontekstu schematu XAML nie została omówiona w dokumentacji WPF, która dotyczy języka WPF XAML; zachowanie, które umożliwia kontekst schematu XAML, może być w pełni zrozumiałe tylko w przypadku integracji z omówieniem sposobu działania domyślnego kontekstu schematu XAML. Kontekst schematu XAML WPF implementuje następujące zachowanie.

Przesłonięcia odnośników: WPF ma kilka con tryb namiotu ls dla języka XAML, gdzie istnieją właściwości zawartości XAML, które działają bez ContentPropertyAttribute przypisywana. LookupContentProperty zastąpienia dla WPF implementują to zachowanie.

Odroczenie dla wyrażeń WPF: WPF zawiera kilka klas wyrażeń, które odroczy wartość do momentu udostępnienia kontekstu środowiska uruchomieniowego. Ponadto rozszerzenie szablonu jest zachowaniem środowiska uruchomieniowego, które opiera się na technikach odroczenia.

Optymalizacje wyszukiwania systemu typów: WPF ma obszerne słownictwo XAML i model obiektów, w tym definicje składowych klasy bazowej, które dziedziczą dosłownie setki klas zdefiniowanych w WPF. Ponadto sam WPF jest rozłożony na kilka zestawów. WPF optymalizuje wyszukiwanie typów przy użyciu tabel odnośników i innych technik. Zapewnia to ulepszenia wydajności w domyślnym kontekście schematu XAML i wyszukiwania typu opartego na clR. W przypadkach, gdy typy nie istnieją w tabeli odnośników, zachowanie używa technik kontekstu schematu XAML, które są podobne do domyślnego kontekstu schematu XAML.

Rozszerzenia XamlType i XamlMember: platforma WPF rozszerza pojęcia dotyczące właściwości o właściwości zależności i pojęcia dotyczące zdarzeń z zdarzeniami kierowanymi. Aby zapewnić im większą widoczność operacji przetwarzania XAML, rozszerzenie platformy XamlType WPF i XamlMemberdodanie właściwości wewnętrznych, które zgłaszają właściwość zależności i charakterystykę zdarzeń kierowanych.

Uzyskiwanie dostępu do kontekstu schematu XAML WPF

Jeśli używasz technik XAML opartych na WPF System.Windows.Markup.XamlReader lub System.Windows.Markup.XamlWriter, kontekst schematu XAML WPF jest już używany w tych implementacjach czytnika XAML i modułu zapisywania XAML.

Jeśli używasz innych implementacji czytnika XAML lub modułu zapisywania XAML, które nie są inicjowane przy użyciu kontekstu schematu WPF XAML, może być możliwe uzyskanie działającego kontekstu schematu XAML WPF z .XamlReader.GetWpfSchemaContext Następnie możesz użyć tej wartości jako inicjowania dla innego interfejsu API, który używa elementu XamlSchemaContext. Można na przykład wywołać XamlXmlReader inicjowanie i przekazać kontekst schematu WPF XAML. Możesz też użyć kontekstu schematu XAML WPF dla operacji systemowych typu XAML. Może to obejmować inicjowanie konstrukcji obiektu XamlType lub XamlMemberlub wywoływanie metody XamlSchemaContext.GetXamlType.

Należy pamiętać, że jeśli uzyskujesz dostęp do niektórych aspektów języka WPF XAML z perspektywy czystego strumienia węzłów XAML, niektóre funkcje platformy WPF mogły jeszcze nie działać. Na przykład szablony WPF dla kontrolek nie są jeszcze stosowane. W związku z tym jeśli uzyskujesz dostęp do właściwości, która w czasie wykonywania może zostać wypełniona pełnym drzewem wizualnym, może zostać wyświetlona tylko wartość właściwości odwołującej się do szablonu. Kontekst usługi zapewniany dla rozszerzeń znaczników WPF może również nie być dokładny, jeśli podano go w sytuacji innej niż środowisko uruchomieniowe, i może spowodować wyjątki podczas próby zapisania grafu obiektu.

Ładowanie kodu XAML i zestawu

Ładowanie zestawów dla usług XAML i .NET XAML integruje się z zdefiniowaną przez CLR koncepcją AppDomain. Kontekst schematu XAML interpretuje sposób ładowania zestawów lub znajdowania typów w czasie wykonywania lub w czasie projektowania na podstawie użycia AppDomain i innych czynników. Logika jest nieco inna w zależności od tego, czy XAML jest luźny XAML dla czytnika XAML, czy XAML skompilowany do biblioteki DLL przez XamlBuildTask, lub jest baML generowany przez WPF PresentationBuildTask.

Kontekst schematu XAML dla WPF integruje się z modelem aplikacji WPF, który z kolei używa AppDomain , a także innych czynników, które są szczegółami implementacji WPF.

Dane wejściowe czytnika XAML (luźne XAML)

  1. Kontekst schematu XAML iteruje za pośrednictwem AppDomain aplikacji, szukając już załadowanego zestawu, który pasuje do wszystkich aspektów nazwy, począwszy od ostatnio załadowanego zestawu. Jeśli zostanie znalezione dopasowanie, ten zestaw jest używany do rozpoznawania.

  2. W przeciwnym razie do załadowania zestawu są używane jedno z następujących technik opartych na interfejsie API CLR Assembly :

    • Jeśli nazwa jest kwalifikowana w mapowaniu, wywołaj Assembly.Load(String) nazwę kwalifikowaną.

    • Jeśli poprzedni krok zakończy się niepowodzeniem, użyj krótkiej nazwy (i tokenu klucza publicznego, jeśli istnieje), aby wywołać metodę Assembly.Load(String).

    • Jeśli nazwa jest niekwalifikowana w mapowaniu, wywołaj metodę Assembly.LoadWithPartialName.

XamlBuildTask

XamlBuildTask jest używany w programach Windows Communication Foundation (WCF) i Windows Workflow Foundation.

Należy pamiętać, że odwołania do zestawów za pośrednictwem XamlBuildTask są zawsze w pełni kwalifikowane.

  1. Wywołaj Assembly.Load(String) nazwę kwalifikowaną.

  2. Jeśli poprzedni krok zakończy się niepowodzeniem, użyj krótkiej nazwy (i tokenu klucza publicznego, jeśli istnieje), aby wywołać metodę Assembly.Load(String).

BAML (PresentationBuildTask)

Istnieją dwa aspekty ładowania zestawów dla języka BAML: ładowanie początkowego zestawu zawierającego kod BAML jako składnik i ładowanie zestawów kopii zapasowych typów dla dowolnego typu, do którego odwołuje się produkcja BAML.

Ładowanie zestawów dla początkowego adiustacji:

Odwołanie do zestawu w celu załadowania znaczników z jest zawsze niekwalifikowane.

  1. Kontekst schematu WPF XAML iteruje za pośrednictwem AppDomain aplikacji WPF, szukając już załadowanego zestawu zgodnego ze wszystkimi aspektami nazwy, począwszy od ostatnio załadowanego zestawu. Jeśli zostanie znalezione dopasowanie, ten zestaw jest używany do rozpoznawania.

  2. Jeśli poprzedni krok zakończy się niepowodzeniem, użyj krótkiej nazwy (i tokenu klucza publicznego, jeśli istnieje), aby wywołać metodę Assembly.Load(String).

Odwołania do zestawów według typów BAML:

Odwołania do zestawów dla typów używanych w środowisku produkcyjnym BAML są zawsze w pełni kwalifikowane jako dane wyjściowe zadania kompilacji.

  1. Kontekst schematu WPF XAML iteruje za pośrednictwem AppDomain aplikacji WPF, szukając już załadowanego zestawu zgodnego ze wszystkimi aspektami nazwy, począwszy od ostatnio załadowanego zestawu. Jeśli zostanie znalezione dopasowanie, ten zestaw jest używany do rozpoznawania.

  2. W przeciwnym razie do załadowania zestawu służy jedna z następujących technik:

    • Wywołaj Assembly.Load(String) nazwę kwalifikowaną.

    • Jeśli krótka nazwa i kombinacja tokenu klucza publicznego jest zgodna z zestawem, z którego został załadowany kod BAML, użyj tego zestawu.

    • Użyj krótkiej nazwy i tokenu klucza publicznego, aby wywołać metodę Assembly.Load(String).

Zobacz też