Przetwarzanie białych znaków w języku XAML
Reguły języka dla stanu XAML, że istotne białe znaki muszą być przetwarzane przez implementację procesora XAML. W tym artykule dokumentacji tych reguł języka XAML. Dokumentuje również dodatkową obsługę białych znaków zdefiniowanych przez implementację procesora XAML (Windows Presentation Foundation) i składnika zapisywania XAML na potrzeby serializacji.
Definicja odstępu
Spójne ze znakami XML, odstępami w języku XAML są spacje, kanały wiersza i tabulatory. Odpowiadają one odpowiednio wartościom Unicode 0020, 000A i 0009.
Normalizacja odstępów
Domyślnie w przypadku przetwarzania pliku XAML przez procesor XAML następuje następująca normalizacja odstępu:
Znaki kanału wiersza między znakami wschodnioazjatyckimi są usuwane. Zobacz sekcję "Znaki wschodnioazjatyckie" w dalszej części tego tematu, aby zapoznać się z definicją tego terminu.
Wszystkie znaki odstępu (spacja, kanał wiersza, karta) są konwertowane na spacje.
Wszystkie kolejne spacje są usuwane i zastępowane przez jedną spację.
Spacja bezpośrednio po tagu startowym zostanie usunięta.
Spacja bezpośrednio przed usunięciem tagu końcowego.
Wartość domyślna odpowiada stanowi oznaczonemu przez domyślną wartość atrybutu xml:space.
Białe znaki w tekście wewnętrznym i elementach pierwotnych ciągów
Poprzednie reguły normalizacji dotyczą tekstu wewnętrznego znajdującego się w elementach XAML. Po normalizacji procesor XAML konwertuje dowolny tekst wewnętrzny na odpowiedni typ w następujący sposób:
Jeśli typ właściwości nie jest kolekcją, ale nie jest bezpośrednio typem Object, procesor XAML próbuje przekonwertować na ten typ przy użyciu konwertera typów. Konwersja nie powiodła się w tym miejscu powoduje błąd czasu kompilacji.
Jeśli typ właściwości jest kolekcją, a tekst wewnętrzny jest ciągły (bez intervening tagów elementów), tekst wewnętrzny jest analizowany jako pojedynczy String. Jeśli typ kolekcji nie może zaakceptować String, powoduje to również błąd czasu kompilacji.
Jeśli typ właściwości jest Object, tekst wewnętrzny jest analizowany jako pojedynczy String. Jeśli istnieją interweniujące tagi elementów, powoduje to błąd czasu kompilacji, ponieważ typ Object oznacza pojedynczy obiekt (String lub w inny sposób).
Jeśli typ właściwości jest kolekcją, a tekst wewnętrzny nie jest ciągły, pierwszy podciąg jest konwertowany na String i dodawany jako element kolekcji, interweniujący element jest dodawany jako element kolekcji, a na koniec końcowy podciąg (jeśli istnieje) zostanie dodany do kolekcji jako trzeci element String.
Zachowywanie białych znaków
Istnieje kilka technik zachowania białych znaków w źródle XAML w przypadku ostatecznej prezentacji, które nie mają wpływu na normalizację białych znaków procesora XAML.
xml:space="preserve": określ ten atrybut na poziomie elementu, w którym wymagane jest zachowanie odstępu. Spowoduje to zachowanie wszystkich białych znaków, w tym spacji, które mogą zostać dodane przez aplikacje do edycji kodu do elementów "pretty-print", wyrównują elementy jako intuicyjne zagnieżdżanie wizualne. Jednak to, czy te spacje są renderowane przez model zawartości dla elementu zawierającego. Unikaj określania xml:space="preserve"
na poziomie głównym, ponieważ większość modeli obiektów nie uwzględnia odstępu jako istotnego niezależnie od sposobu ustawiania atrybutu. Ustawienie xml:space
globalnie może mieć wpływ na wydajność przetwarzania XAML (szczególnie serializacji) w niektórych implementacjach. Lepszym rozwiązaniem jest ustawienie atrybutu tylko na poziomie elementów, które renderują biały znak w ciągach lub są kolekcjami znaczącymi odstępami.
Jednostki i spacje nienależące: język XAML obsługuje umieszczanie dowolnej jednostki Unicode w modelu obiektów tekstowych. Można użyć dedykowanych jednostek, takich jak spacja niezwiązana ( w kodowaniu UTF-8). Można również użyć kontrolek tekstu sformatowanego, które obsługują znaki spacji bez złamania. Należy zachować ostrożność, jeśli używasz jednostek do symulowania cech układu, takich jak wcięcie, ponieważ dane wyjściowe w czasie wykonywania jednostek będą się różnić w zależności od większej liczby czynników niż możliwości generowania wcięcia wyników w typowym systemie układu, takim jak odpowiednie użycie paneli i marginesów. Na przykład jednostki są mapowane na czcionki i mogą zmieniać rozmiar w odpowiedzi na wybór czcionki użytkownika.
Znaki wschodnioazjatyckie
Znaki wschodnioazjatyckie są definiowane jako zestaw zakresów znaków Unicode U+20000 do U+2FFFD i U+30000 do U+3FFFD. Ten podzbiór jest również czasami nazywany "ideografami CJK". Aby uzyskać więcej informacji, zobacz https://www.unicode.org.
Modele zawartości białych znaków i tekstu
W praktyce zachowanie białych znaków jest związane tylko z podzbiorem wszystkich możliwych modeli zawartości. Ten podzbiór składa się z modeli zawartości, które mogą przyjmować pojedynczy typ String w jakiejś formie, dedykowaną kolekcję String lub mieszaninę String i innych typów w kolekcji IList lub ICollection<T>.
Modele zawartości białych znaków i tekstu w WPF
W celach ilustracyjnych pozostała część tej sekcji odwołuje się do określonych typów zdefiniowanych przez WPF. Funkcje obsługi białych znaków opisane w tym artykule są istotne zarówno dla usług XAML platformy .NET, jak i WPF. Aby zobaczyć to zachowanie w akcji, możesz eksperymentować z niektórymi znacznikami WPF XAML, wyświetlić wyniki na grafie obiektu, a następnie serializować z powrotem w celu narzutu.
Nawet w przypadku modeli zawartości, które mogą przyjmować ciągi, domyślne zachowanie w tych modelach zawartości polega na tym, że wszelkie białe znaki, które pozostają, nie są traktowane jako znaczące. Na przykład ListBox przyjmuje IList, ale białe znaki (takie jak odstępy między poszczególnymi ListBoxItem) nie są zachowywane i nie są renderowane. Jeśli próbujesz użyć kanałów wiersza jako separatorów między ciągami dla ListBoxItem elementów, w ogóle nie działa; ciągi oddzielone kanałami wiersza są traktowane jako jeden ciąg i jeden element.
Kolekcje, które traktują białe znaki jako znaczące, są zwykle częścią modelu dokumentu przepływu. Podstawowa kolekcja, która obsługuje zachowanie zachowywania białych znaków, jest InlineCollection. Ta klasa kolekcji jest zadeklarowana przy użyciu WhitespaceSignificantCollectionAttribute; po znalezieniu tego atrybutu procesor XAML będzie traktować białe znaki w kolekcji jako istotne. Kombinacja xml:space="preserve"
i białych znaków w WhitespaceSignificantCollectionAttribute oznacza, że wszystkie białe znaki są zachowywane i renderowane. Połączenie xml:space="default"
i białych znaków w WhitespaceSignificantCollectionAttribute powoduje początkową normalizację odstępu opisaną wcześniej, co pozostawia jedną spację w określonych pozycjach, a te spacje są zachowywane i renderowane. To zachowanie jest pożądane dla Ciebie i należy użyć xml:space
selektywnie, aby włączyć żądane zachowanie.
Ponadto niektóre elementy wbudowane, które oznaczają podział wiersza w modelu dokumentu przepływu, nie powinny celowo wprowadzać dodatkowego miejsca nawet w kolekcji znaczącej w białej przestrzeni. Na przykład element LineBreak ma taki sam cel jak tag <BR/> w kodzie HTML, a w celu zapewnienia czytelności w adiustacji zazwyczaj LineBreak jest oddzielony od dowolnego późniejszego tekstu przez utworzony kanał wiersza. Nie należy znormalizować tego kanału liniowego, aby stać się miejscem wiodącym w kolejnej linii. Aby włączyć to zachowanie, definicja klasy dla elementu LineBreak stosuje TrimSurroundingWhitespaceAttribute, który jest następnie interpretowany przez procesor XAML, aby oznaczać, że białe znaki otaczające LineBreak są zawsze przycinane.
Zobacz też
-
przeglądu XAML (WPF .NET) - jednostki znaków XML i XAML
- obsługa xml:space w XAML
.NET Desktop feedback