Обработка пробелов в XAMLWhite-space processing in XAML

Правила языка для состояния XAML, которые являются значимыми пробелами, должны обрабатываться XAMLXAML реализацией процессора.The language rules for XAML state that significant white space must be processed by a XAMLXAML processor implementation. В этой статье описываются эти правила языка XAML.This article documents these XAML language rules. В нем также документируется дополнительная обработка пробелов, определяемая Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) реализацией обработчика XAML и модуля записи XAML для сериализации.It also documents additional white-space handling that is defined by the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) implementation of the XAML processor and the XAML writer for serialization.

Определение пробелаWhite-space definition

В соответствии с XML, пробелы в XAMLXAML — это пробел, перевод строки и знак табуляции. Они соответствуют значениям Юникода 0020, 000A; и 0009 соответственно.Consistent with XML, white-space characters in XAMLXAML are space, linefeed, and tab. These correspond to the Unicode values 0020, 000A, and 0009 respectively.

Нормализация пробеловWhite-space normalization

По умолчанию при XAMLXAML обработке файла процессором возникает следующая нормализация пробелов XAMLXAML :By default the following white-space normalization occurs when a XAMLXAML processor processes a XAMLXAML file:

  1. Символы перевода строки между восточно-азиатскими символами удаляются.Linefeed characters between East Asian characters are removed. Определение этого термина см. в разделе "Символы восточно-азиатских языков" далее.See the "East Asian Characters" section later in this topic for a definition of this term.

  2. Все пробельные символы (пробел, перевод строки, табуляция) преобразуются в пробелы.All white-space characters (space, linefeed, tab) are converted into spaces.

  3. Все последовательные пробелы удаляются и заменяется одним пробелом.All consecutive spaces are deleted and replaced by one space.

  4. Пробел после открывающего тега удаляется.A space immediately following the start tag is deleted.

  5. Пробел перед закрывающим тегом удаляется.A space immediately before the end tag is deleted.

"Default" соответствует состоянию, обозначаемому значением атрибута XML: space по умолчанию."Default" corresponds to the state denoted by the default value of the xml:space attribute.

Пробелы во внутреннем тексте и строковые примитивыWhite space in inner text, and string primitives

Приведенные выше правила нормализации применяются к тексту внутри элементов XAML.The previous normalization rules apply to inner text that is found within XAML elements. После нормализации обработчик XAML преобразует любой внутренний текст в соответствующий тип следующим образом.After normalization, a XAML processor converts any inner text into an appropriate type as follows:

  • Если тип свойства не является коллекцией и типом Object , обработчик XAML попытается преобразовать его в этот тип, используя преобразователь типов.If the type of the property is not a collection but is not directly an Object type, the XAML processor attempts to convert to that type by using its type converter. Неудачное преобразование приводит к ошибке во время компиляции.A failed conversion here causes a compile-time error.

  • Если тип свойства — это коллекция, а внутренний текст не прерывается (не содержит промежуточных тегов элементов), внутренний текст анализируется как один String.If the type of the property is a collection and the inner text is contiguous (no intervening element tags), the inner text is parsed as a single String. Если тип коллекции не может принять String, это также приводит к ошибке во время компиляции.If the collection type cannot accept String, this also causes a compile-time error.

  • Если тип свойства — Object, внутренний текст анализируется как один String.If the type of the property is Object, the inner text is parsed as a single String. Если существуют промежуточные теги элементов, это приводит к ошибке во время компиляции, поскольку Object подразумевает один объект (String или другой).If there are intervening element tags, this causes a compile-time error because the Object type implies a single object (String or otherwise).

  • Если тип свойства — коллекция, а внутренний текст прерывается, первая подстрока преобразуется в String и добавляется как элемент коллекции, затем промежуточный элемент добавляется как элемент коллекции, и, наконец, конечная подстрока (если таковая имеется) добавляется в коллекцию как третий элемент String .If the type of the property is a collection, and the inner text is not contiguous, the first substring is converted into a String and added as a collection item, the intervening element is added as a collection item, and finally the trailing substring (if any) is added to the collection as a third String item.

Сохранение пробеловPreserving white space

Существует несколько методов сохранения пустого пространства в источнике XAMLXAML для окончательного представления, не затрагиваемого XAMLXAML нормализацией пробелов процессора.There are several techniques for preserving white space in the source XAMLXAML for eventual presentation that are not affected by XAMLXAML processor white-space normalization.

XML: Space = "preserve": укажите этот атрибут на уровне элемента, где требуется сохранение пробелов.xml:space="preserve": Specify this attribute at the level of the element where white-space preservation is desired. При этом сохраняются все пробелы, включая те, что могут быть добавлены приложениями редактирования кода для выравнивания элементов и улучшения визуального восприятия.This preserves all white space, which includes the spaces that might be added by code-editing applications to "pretty-print" align elements as a visually intuitive nesting. Однако то, отображаются ли эти пробелы, определяется моделью контента элемента.However, whether those spaces render is determined by the content model for the containing element. Избегайте указания xml:space="preserve" на корневом уровне, так как большинство объектных моделей не рассматривает пробелы как значащие, независимо от того, как задан атрибут.Avoid specifying xml:space="preserve" at the root level because most object models do not consider white space as significant regardless of how you set the attribute. Глобальная установка xml:space может отрицательно повлиять на производительность обработки XAML (в частности, на сериализацию) в некоторых реализациях.Setting xml:space globally may have performance consequences on XAML processing (particularly serialization) in some implementations. Рекомендуется задавать атрибут только на уровне элементов, которые отображают пробелы в строках, или являются коллекциями, значимыми для пробелов.It is a better practice to only set the attribute specifically at the level of elements that render white space within strings, or are white-space significant collections.

Сущности и неразрывные пробелы: XAMLXAML поддерживает помещение любой сущности Юникода в объектную модель текста.Entities and non-breaking spaces: XAMLXAML supports placing any Unicode entity within a text object model. Можно использовать выделенные сущности, такие как неразрывный пробел (&# 160; в кодировке UTF-8).You can use dedicated entities such as nonbreaking space (  in UTF-8 encoding). Можно также использовать элементы управления форматированным текстом, поддерживающие неразрывные пробелы.You can also use rich text controls that support nonbreaking space characters. Следует соблюдать осторожность при использовании сущностей для имитации характеристики разметки, таких как отступы, поскольку выходные данные сущностей во время выполнения зависят от множества факторов, при этом возможности формирования получения отступов в типичной системе разметки, например правильное использование панелей и полей, ограничены.You should be cautious if you are using entities to simulate layout characteristics such as indention, because the run-time output of the entities will vary based on a greater number of factors than would the capabilities for producing indention results in a typical layout system, such as proper use of panels and margins. Например, сущности сопоставляются со шрифтами и могут изменять размер после выбора шрифта пользователем.For instance, entities are mapped to fonts and can change size in response to user font selection.

Восточно-азиатские символыEast Asian characters

"Восточно-азиатские символы" определяются как набор диапазонов символов Юникода от U + 20000 до U + 2FFFD и U + 30000 до U + 3FFFD."East Asian characters" is defined as a set of Unicode character ranges U+20000 to U+2FFFD and U+30000 to U+3FFFD. Это подмножество также иногда называют "CJK-иероглифами".This subset is also sometimes referred to as "CJK ideographs". Для получения дополнительной информации см. https://www.unicode.org.For more information, see https://www.unicode.org.

Модели пробельного и текстового содержимогоWhite space and text content models

На практике сохранение пробелов имеет значение только для подмножества всех возможных моделей содержимого.In practice, preserving white space is only of concern for a subset of all possible content models. Это подмножество состоит из моделей содержимого, которые могут принимать одноэлементный тип String в определенной форме, выделенную коллекцию String или сочетание String и других типов в коллекции IList или ICollection<T> .That subset is composed of content models that can take a singleton String type in some form, a dedicated String collection, or a mixture of String and other types in an IList or ICollection<T> collection.

Модели пробельных и текстовых содержимого в WPFWhite space and text content models in WPF

Для наглядности оставшаяся часть этого подраздела ссылается на конкретные типы, определенные в WPF.For illustration purposes, the remainder of this section references particular types that are defined by WPF. Функции обработки пробелов, описанные в этой статье, относятся к службам .NET XAML и WPF.The white-space handling features that are described in this article are pertinent to both .NET XAML Services and WPF. Чтобы увидеть это в действии, можно поэкспериментировать с некоторой разметкой WPF XAML, просмотреть результаты в графе объектов и снова сериализовать их в разметку.To see this behavior in action, you might experiment with some WPF XAML markup, view the results in an object graph, and then serialize back to markup again.

Даже для моделей содержимого, которые могут принимать строки, поведение по умолчанию в этих моделях содержимого заключается в том, что все остающиеся пробелы не считаются значимыми.Even for content models that can take strings, the default behavior within these content models is that any white space that remains is not treated as significant. Например, ListBox принимает IList , но пробел (например, символы перевода строки между ними ListBoxItem ) не сохраняется и не подготавливается к просмотру.For example, ListBox takes an IList, but the white space (such as linefeeds between each ListBoxItem) is not preserved and not rendered. Попытка использовать символ перевода строки в качестве разделителей между строками для элементов ListBoxItem вообще не даст результатов. Строки, разделенные символами перевода строки, считаются одной строкой и одним элементом.If you attempt to use linefeeds as separators between strings for ListBoxItem items, it does not work at all; the strings that are separated by the linefeeds are treated as one string and one item.

Коллекции, которые обрабатывают пробелы как значащие, обычно являются частью модели документа нефиксированного формата.Those collections that do treat white space as significant are typically part of the flow document model. Основной коллекцией, поддерживающей сохранение пробелов, является InlineCollection .The primary collection that supports white-space preservation behavior is InlineCollection. Этот класс коллекции объявлен с WhitespaceSignificantCollectionAttribute атрибутом; при обнаружении этого атрибута XAMLXAML процессор будет обрабатывать пробелы в коллекции как значащие.This collection class is declared with the WhitespaceSignificantCollectionAttribute; when this attribute is found, the XAMLXAML processor will treat white space within the collection as significant. Сочетание пробелов xml:space="preserve" в WhitespaceSignificantCollectionAttribute отмеченной коллекции состоит в том, что все пробелы сохраняются и подготавливаются к просмотру.The combination of xml:space="preserve" and white space within a WhitespaceSignificantCollectionAttribute denoted collection is that all white space is preserved and rendered. Сочетание и пробелов xml:space="default" в в WhitespaceSignificantCollectionAttribute вызывает начальную нормализацию пробелов, которая оставляет один пробел в определенных позициях, и эти пробелы сохраняются и подготавливаются к просмотру.The combination of xml:space="default" and white space within a WhitespaceSignificantCollectionAttribute causes the initial white-space normalization described earlier, which leaves one space in certain positions, and those spaces are preserved and rendered. Предпочтительное для вас поведение выбираете вы. Следует выборочно использовать xml:space , чтобы включить желаемое поведение.Which behavior is desirable is up to you, and you should use xml:space selectively to enable the behavior that you want.

Кроме того, некоторые встроенные элементы, которые указывают на разрыв строки в модели документов нефиксированного формата, должны намеренно не ввести дополнительное пространство, даже в коллекцию значимых пробелов.Also, certain inline elements that connote a line break in a flow document model should deliberately not introduce an extra space even in a white-space significant collection. Например, LineBreak элемент имеет ту же цель, что <BR/> и тег в HTML, и для удобочитаемости в разметке, как правило, LineBreak отделяется от любого последующего текста с помощью авторского перевода строки.For example, the LineBreak element has the same purpose as the <BR/> tag in HTML, and for readability in markup, typically a LineBreak is separated from any subsequent text by an authored linefeed. Этот символ не следует нормализовать, чтобы он не стал начальным пробелом в следующей строке.That linefeed should not be normalized to become a leading space in the subsequent line. Чтобы включить это поведение, определение класса для LineBreak элемента применяет объект TrimSurroundingWhitespaceAttribute , который затем интерпретируется XAMLXAML процессором, что означает, что пробельный пробел LineBreak всегда усекается.To enable that behavior, the class definition for the LineBreak element applies the TrimSurroundingWhitespaceAttribute, which is then interpreted by the XAMLXAML processor to mean that white space surrounding LineBreak is always trimmed.

См. также разделSee also