Przetwarzanie spacji w 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:

  1. 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.

  2. Wszystkie znaki odstępu (spacja, kanał wiersza, karta) są konwertowane na spacje.

  3. Wszystkie kolejne spacje są usuwane i zastępowane przez jedną spację.

  4. Spacja bezpośrednio po tagu startowym zostanie usunięta.

  5. 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 interweniujących tagów elementów), tekst wewnętrzny jest analizowany jako pojedynczy Stringelement . Jeśli typ kolekcji nie może zaakceptować String, powoduje to również błąd czasu kompilacji.

  • Jeśli typ właściwości to Object, tekst wewnętrzny jest analizowany jako pojedynczy Stringelement . Jeśli istnieją interweniujące tagi elementów, powoduje to błąd czasu kompilacji, ponieważ Object typ 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 zostanie przekonwertowany na String element i dodany jako element kolekcji, intervening element zostanie dodany jako element kolekcji, a na koniec końcowy podciąg (jeśli istnieje) zostanie dodany do kolekcji jako trzeci String element.

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, na 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 renderowanie tych spacji jest określane przez con tryb namiotu l 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 globalne 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żesz 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". W celu uzyskania więcej informacji, zobacz następujący temat: https://www.unicode.org.

Białe znaki i znaki con tryb namiotu ls

W praktyce zachowanie białych znaków jest związane tylko z podzbiorem wszystkich możliwych con tryb namiotu ls. Ten podzbiór składa się z con tryb namiotu ls, które mogą przyjmować pojedynczy String typ w jakiejś formie, dedykowanej String kolekcji lub kombinacji String i innych typów w IList kolekcji lubICollection<T>.

Białe znaki i znaki con tryb namiotu ls 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 znaków con tryb namiotu ls, które mogą przyjmować ciągi, domyślne zachowanie w ramach tych con tryb namiotu ls jest to, że wszelkie białe znaki, które pozostają, nie są traktowane jako znaczące. Na przykład ListBox przyjmuje znak IList, ale białe znaki (takie jak kanały liniowe między poszczególnymi ListBoxItemelementami ) 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 rozdzielone przez kanał 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 odstępów białych, to InlineCollection. Ta klasa kolekcji jest zadeklarowana za pomocą elementu ; po znalezieniu WhitespaceSignificantCollectionAttributetego atrybutu procesor XAML będzie traktować biały znak w kolekcji jako znaczący. Kombinacja xml:space="preserve" i białych znaków w oznaczonej WhitespaceSignificantCollectionAttribute kolekcji polega na tym, że wszystkie białe znaki są zachowywane i renderowane. Kombinacja i białych znaków w obrębie elementu WhitespaceSignificantCollectionAttribute powoduje początkową normalizację odstępu xml:space="default" opisaną wcześniej, która pozostawia jedno miejsce 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 LineBreak element ma taki sam cel jak <tag BR/> w kodzie HTML, a w przypadku czytelności w adiustacji zazwyczaj element LineBreak jest oddzielony od dowolnego późniejszego tekstu przez kanał wiersza autorstwa. 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 LineBreak elementu stosuje TrimSurroundingWhitespaceAttributeelement , który jest następnie interpretowany przez procesor XAML, aby oznaczać, że odstęp wokół LineBreak jest zawsze przycinany.

Zobacz też