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. interfejs API XamlServices można podsumować w następujący sposób: Load
lub Parse
w celu obsługi ścieżki ładowania XAML, Save
do obsługi ścieżki zapisywania XAML i Transform
w celu zapewnienia techniki, która łączy ścieżkę ładowania i zapisuje ścieżkę.
Transform
można 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.
Ładunek
Różne przeciążenia Load implementują pełną logikę 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 implementacji XamlReader.
Najprostszym przeciążeniem dla większości scenariuszy jest Load(String). To przeciążenie ma parametr fileName
, 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ż Stream jest częstym wynikiem innych interfejsów API System.IO, 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) to przeciążenia, 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 interfejsu API Create
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. 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 scenariuszy System.IO, 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ć XmlReader, TextReaderlub XamlReader, które opakowuje dane wejściowe XAML, ładując je za pomocą interfejsów API czytelnika.
Wewnętrznie każde z powyższych przeciążeń jest ostatecznie Load(XmlReader), a przekazany XmlReader jest używany do utworzenia nowego XamlXmlReader.
Sygnatura Load
, która zapewnia bardziej zaawansowane scenariusze, jest Load(XamlReader). Tego podpisu można użyć w jednym z następujących przypadków:
Zdefiniowano własną implementację XamlReader.
Należy określić ustawienia dla 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 XamlServices jest XamlXmlReader. Jeśli podasz własne XamlXmlReader z ustawieniami, poniżej przedstawiono właściwości ustawiania XamlXmlReaderSettingsinnej niż domyślna:
CloseInput
SkipXmlCompatibilityProcessing
XmlLang
XmlSpacePreserve
Parse
Parse jest jak Load
, ponieważ 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 to uproszczone podejście, które jest bardziej odpowiednie dla scenariuszy aplikacji niż scenariusze struktury. Aby uzyskać więcej informacji, zobacz Parse.
Parse to po prostu opakowane wywołanie Load(XmlReader), które obejmuje StringReader wewnętrznie.
Zapisać
Różne przeciążenia Save implementują ścieżkę zapisywania. Wszystkie metody Save 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 Load lub z innym interfejsem 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 API Save reprezentują jedną definicję tego salda. Interfejsy API Save używają dostępnego kontekstu schematu XAML i domyślnych właściwości opartych na clR XamlType, XamlMemberi innych koncepcji systemu typów XAML i XAML w celu określenia, gdzie niektóre konstrukcje strumienia węzłów XAML można zoptymalizować, gdy zostaną zapisane z powrotem do znaczników. Na przykład XamlServices zapisywanie ścieżek może użyć domyślnego kontekstu schematu XAML opartego na clR, aby rozpoznać XamlType dla obiektów, może określić XamlType.ContentProperty, a następnie pominąć tagi elementów właściwości podczas zapisywania właściwości do zawartości XAML obiektu.
Przekształcać
Transform konwertuje lub przekształca kod XAML, łącząc ścieżkę ładowania i ścieżkę zapisu jako pojedynczą operację. Inny kontekst schematu lub inny system typów kopii zapasowych może służyć do XamlReader 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ć 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 przy użyciu XamlXmlReader i przejdź do węzłów z kolejnymi wywołaniami Read. 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 as-is. Następnie należy wysłać węzeł do odpowiedniego interfejsu API Write
XamlObjectWriter i zapisać obiekt. 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ż
- XamlObjectWriter
- XamlServices
- usług XAML
.NET Desktop feedback