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 klasy XamlSchemaContext. 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 korzystają z domyślnego kontekstu schematu XAML.
Można utworzyć XamlSchemaContext, która hermetyzuje domyślne zachowanie, wywołując konstruktor 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ą XamlSchemaContext parametru wejściowego.
Domyślny kontekst schematu XAML opiera się na odbiciu CLR dla zachowania mapowania typów. Obejmuje to badanie definiowania TypeCLR i 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 wzorzec Invoker
, 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 LocalAssembly może sugerować ładowanie zestawu w scenariuszach, 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 modeli zawartości dla języka XAML, w których istnieją właściwości zawartości XAML, które działają bez ContentPropertyAttribute przypisane. LookupContentProperty zastąpienia dla WPF implementują to zachowanie.
Odroczenie dla wyrażeń WPF: WPF zawiera kilka klas wyrażeń, które odroczają 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 przez 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: WPF rozszerza koncepcje właściwości o właściwości zależności i pojęcia dotyczące zdarzeń z zdarzeniami tras. Aby zapewnić im większą widoczność operacji przetwarzania XAML, WPF rozszerza XamlType i XamlMemberoraz dodaje właściwości wewnętrzne, które zgłaszają właściwość zależności i charakterystyki zdarzeń kierowanych.
Uzyskiwanie dostępu do kontekstu schematu XAML WPF
Jeśli używasz technik XAML opartych na System.Windows.Markup.XamlReader WPF lub System.Windows.Markup.XamlWriter, kontekst schematu WPF XAML 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żesz uzyskać działający kontekst 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 XamlSchemaContext. Można na przykład wywołać XamlXmlReader na potrzeby inicjowania 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 XamlType lub XamlMemberlub wywoływanie 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 kod XAML jest luźny XAML dla czytnika XAML, czy XAML skompilowany do biblioteki DLL przez XamlBuildTask
, lub jest kodEM BAML generowanym przez PresentationBuildTask
WPF.
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)
Kontekst schematu XAML iteruje przez 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.
W przeciwnym razie do załadowania zestawu są używane jedno z następujących technik opartych na interfejsie API Assembly CLR:
Jeśli nazwa jest kwalifikowana w mapowaniu, wywołaj Assembly.Load(String) w kwalifikowanej nazwie.
Jeśli poprzedni krok zakończy się niepowodzeniem, użyj krótkiej nazwy (i tokenu klucza publicznego, jeśli istnieje), aby wywołać Assembly.Load(String).
Jeśli nazwa jest niekwalifikowana w mapowaniu, wywołaj metodę Assembly.LoadWithPartialName.
XamlBuildTask
XamlBuildTask
jest używany dla programu 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.
Wywołaj Assembly.Load(String) w kwalifikowanej nazwie.
Jeśli poprzedni krok zakończy się niepowodzeniem, użyj krótkiej nazwy (i tokenu klucza publicznego, jeśli istnieje), aby wywołać 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.
Kontekst schematu WPF XAML iteruje przez AppDomain aplikacji WPF, 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.
Jeśli poprzedni krok zakończy się niepowodzeniem, użyj krótkiej nazwy (i tokenu klucza publicznego, jeśli istnieje), aby wywołać 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.
Kontekst schematu WPF XAML iteruje przez AppDomain aplikacji WPF, 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.
W przeciwnym razie do załadowania zestawu służy jedna z następujących technik:
Wywołaj Assembly.Load(String) w kwalifikowanej nazwie.
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ć Assembly.Load(String).
Zobacz też
.NET Desktop feedback