Klasa XAMLServices i podstawowy odczyt lub zapis XAML

XamlServices jest klasą dostarczaną przez platformę .NET, która może służyć do obsługi scenariuszy XAML, które nie wymagają określonego dostępu do strumienia węzła XAML ani do informacji o systemie typów XAML uzyskanych z tych węzłów. XamlServices Interfejs API można podsumować w następujący sposób: Load lub Parse w celu obsługi ścieżki ładowania XAML w Save celu obsługi ścieżki zapisywania XAML i Transform zapewnienia techniki łączenia ścieżki ładowania i zapisywania ścieżki. Transform Może służyć do zmiany z jednego schematu XAML na inny. W tym temacie przedstawiono podsumowanie każdej z tych klasyfikacji interfejsów API i opisano różnice między przeciążeniami określonej metody.

Ładowanie

Różne przeciążenia implementowania pełnej Load logiki dla ścieżki ładowania. Ścieżka ładowania używa kodu XAML w jakiejś formie i generuje strumień węzła XAML. Większość tych ścieżek ładowania używa języka XAML w zakodowanej postaci pliku tekstowego XML. Można jednak również załadować strumień ogólny lub załadować wstępnie załadowane źródło XAML, które jest już zawarte w innej XamlReader implementacji.

Najprostszym przeciążeniem dla większości scenariuszy jest Load(String). To przeciążenie ma fileName parametr, który jest po prostu nazwą pliku tekstowego zawierającego kod XAML do załadowania. Jest to odpowiednie w przypadku scenariuszy aplikacji, takich jak aplikacje o pełnym zaufaniu, które wcześniej serializowały stan lub dane na komputerze lokalnym. Jest to również przydatne w przypadku struktur, w których definiujesz model aplikacji i chcesz załadować jeden ze standardowych plików definiujących zachowanie aplikacji, uruchamianie interfejsu użytkownika lub inne funkcje zdefiniowane przez platformę, które używają języka XAML.

Load(Stream) ma podobne scenariusze. To przeciążenie może być przydatne, jeśli użytkownik wybierze pliki do załadowania, ponieważ jest Stream to częste dane wyjściowe innych System.IO interfejsów API, które mogą uzyskiwać dostęp do systemu plików. Możesz też uzyskiwać dostęp do źródeł XAML za pośrednictwem asynchronicznych metod pobierania lub innych technik sieciowych, które również udostępniają strumień. (Ładowanie ze strumienia lub wybranego przez użytkownika źródła może mieć wpływ na bezpieczeństwo. Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące zabezpieczeń XAML.

Load(TextReader) i Load(XmlReader) są przeciążeniami, które opierają się na czytnikach formatów z poprzednich wersji platformy .NET. Aby użyć tych przeciążeń, należy już utworzyć wystąpienie czytnika i użyć jego Create interfejsu API do załadowania kodu XAML w odpowiednim formularzu (tekst lub XML). Jeśli wskaźniki rekordów zostały już przeniesione do innych czytników lub wykonano z nimi inne operacje, nie jest to ważne. Logika ścieżki ładowania z Load zawsze przetwarza całe dane wejściowe XAML z katalogu głównego w dół. Następujące scenariusze mogą uzasadniać użycie tych przeciążeń:

  • Projektowanie powierzchni, na których zapewniasz prostą możliwość edytowania kodu XAML z istniejącego edytora tekstu specyficznego dla języka XML.

  • Warianty podstawowych System.IO scenariuszy, w których używasz dedykowanych czytników do otwierania plików lub strumieni. Logika wykonuje podstawowe sprawdzanie lub przetwarzanie zawartości, zanim podejmie próbę załadowania jako XAML.

Możesz załadować plik lub strumień albo załadować XmlReaderelement , TextReaderalbo XamlReader opakowuje dane wejściowe XAML, ładując je za pomocą interfejsów API czytnika.

Wewnętrznie każde z powyższych przeciążeń jest ostatecznie Load(XmlReader), a przekazany XmlReader jest używany do utworzenia nowego XamlXmlReader.

Podpis Load , który zapewnia bardziej zaawansowane scenariusze, to Load(XamlReader). Tego podpisu można użyć w jednym z następujących przypadków:

  • Zdefiniowano własną implementację elementu XamlReader.

  • Musisz określić ustawienia, XamlReader które różnią się od ustawień domyślnych.

Przykłady ustawień innych niż domyślne:

AllowProtectedMembersOnRoot
BaseUri
IgnoreUidsOnPropertyElements
LocalAssembly
ValuesMustBeString.

Domyślnym czytnikiem elementu XamlServices jest XamlXmlReader. Jeśli podasz własne XamlXmlReader ustawienia, poniżej przedstawiono właściwości ustawiania wartości innej niż domyślna XamlXmlReaderSettings:

CloseInput
SkipXmlCompatibilityProcessing
XmlLang
XmlSpacePreserve

Analizuj

Parse jest jak Load dlatego, że jest to interfejs API ścieżki ładowania, który tworzy strumień węzła XAML na podstawie danych wejściowych XAML. Jednak w tym przypadku dane wejściowe XAML są udostępniane bezpośrednio jako ciąg zawierający cały kod XAML do załadowania. Parse jest uproszczonym podejściem, które jest bardziej odpowiednie dla scenariuszy aplikacji niż scenariusze struktury. W celu uzyskania więcej informacji, zobacz następujący temat: Parse. Parse to po prostu opakowane Load(XmlReader) wywołanie, które obejmuje StringReader wewnętrznie.

Zapisz

Różne przeciążenia implementacji Save ścieżki zapisywania. Save Wszystkie metody przyjmują graf obiektu jako dane wejściowe i generują dane wyjściowe jako strumień, plik lub XmlWriter/TextWriter wystąpienie.

Obiekt wejściowy powinien być obiektem głównym jakiejś reprezentacji obiektu. Może to być pojedynczy katalog główny obiektu biznesowego, katalog główny drzewa obiektów dla strony w scenariuszu interfejsu użytkownika, powierzchnia robocza edycji z narzędzia projektowego lub inne koncepcje obiektów głównych, które są odpowiednie dla scenariuszy.

W wielu scenariuszach drzewo obiektów, które zapisujesz, jest powiązane z oryginalną operacją, która załadowała kod XAML z innym interfejsem Load API zaimplementowanym przez model struktury/aplikacji. Mogą wystąpić różnice przechwycone w drzewie obiektów, które są spowodowane zmianami stanu, zmianami, w których aplikacja przechwyciła ustawienia środowiska uruchomieniowego od użytkownika, zmieniła kod XAML, ponieważ aplikacja jest powierzchnią projektową XAML itp. W przypadku zmian lub bez nich koncepcja pierwszego ładowania kodu XAML z znaczników, a następnie ponownego zapisywania go i porównywania dwóch formularzy znaczników XAML jest czasami nazywana reprezentacją XAML w obie strony.

Wyzwanie dotyczące zapisywania i serializacji złożonego obiektu ustawionego w postaci znaczników polega na osiągnięciu równowagi między pełną reprezentacją bez utraty informacji, a szczegółowością, która sprawia, że język XAML jest mniej czytelny dla człowieka. Ponadto różni klienci języka XAML mogą mieć różne definicje lub oczekiwania dotyczące sposobu ustawiania tego salda. Interfejsy Save API reprezentują jedną definicję tego salda. Interfejsy Save API używają dostępnego kontekstu schematu XAML oraz domyślnych cech opartych na clR systemów , XamlMemberi innych pojęć systemu wewnętrznego XamlTypei XAML XAML w celu określenia, gdzie można zoptymalizować niektóre konstrukcje strumienia węzłów XAML, gdy zostaną zapisane z powrotem do znaczników. Na przykład XamlServices ścieżki zapisywania mogą używać domyślnego kontekstu schematu XAML opartego na clR do rozpoznawania XamlType obiektów, mogą określić XamlType.ContentPropertyelement , a następnie pominąć tagi elementów właściwości podczas zapisywania właściwości do zawartości XAML obiektu.

Przekształcanie

Transform Konwertuje lub przekształca kod XAML, łącząc ścieżkę ładowania i ścieżkę zapisu jako pojedynczą operację. Można użyć innego kontekstu schematu lub innego systemu typów kopii zapasowych dla XamlReader systemów i XamlWriter, co wpływa na sposób przekształcania wynikowego kodu XAML. Działa to dobrze w przypadku szerokich operacji przekształcania.

W przypadku operacji, które polegają na zbadaniu każdego węzła w strumieniu węzła XAML, zwykle nie należy używać elementu Transform. Zamiast tego należy zdefiniować własną serię operacji ścieżki zapisywania ścieżki ładowania i przeplatać własną logikę. W jednej ze ścieżek użyj pary czytnika XAML/modułu zapisywania XAML wokół własnej pętli węzłów. Na przykład załaduj początkowy kod XAML i XamlXmlReader przejdź do węzłów z kolejnymi Read wywołaniami. Działanie na poziomie strumienia węzła XAML umożliwia teraz dostosowanie poszczególnych węzłów (typów, elementów członkowskich, innych węzłów) w celu zastosowania przekształcenia lub pozostawienie węzła w stanie rzeczywistym. Następnie należy wysłać węzeł do odpowiedniego Write interfejsu API obiektu XamlObjectWriter i zapisać go. Aby uzyskać więcej informacji, zobacz Understanding XAML Node Stream Structures and Concepts (Omówienie struktur i pojęć strumienia węzłów XAML).

Zobacz też