Поделиться через


Обработка пробелов в XAML

Обновлен: Ноябрь 2007

Язык XAML (Extensible Application Markup Language) имеет языковые правила, определяющие значимость пробела при обработке реализацией обработчика XAML. В разделе описаны эти языковые правила, а также порядок обработки дополнительных пробелов, определенных в реализации Windows Presentation Foundation (WPF) обработчика XAML, и средство записи XAML для сериализации.

Обработка пробелов

Определение пробела

Согласно XML, символами пробелов в XAML являются пробелы, перевод строки и табуляция. В Юникод они соответствуют значениям 0020, 000A и 0009.

Нормализация пробела

По умолчанию при обработке обработчиком XAML файла XAML выполняется следующая нормализации пробелов.

  1. Знаки перехода строки между восточно-азиатскими символами удаляются. Определение символов восточно-азиатских языков находится далее под заголовком "Символы восточно-азиатских языков".

  2. Все символы пробелов (пробел, перевод строки, табуляция) преобразуются в пробелы.

  3. Все последовательные пробелы удаляются и заменяется одним пробелом.

  4. Пробел, следующий непосредственно за открывающим тегом, удаляется.

  5. Пробел, стоящий непосредственно перед закрывающим тегом, удаляется.

"Умолчание" соответствует состоянию, обозначаемому значением атрибута xml:space по умолчанию.

Пробел во внутреннем тексте и строковые примитивы

Вышеприведенные правила нормализации применяются ко внутреннему тексту элементов XAML. После выполнения нормализации обработчик XAML преобразует любой внутренний текст в соответствующий тип следующим образом:

  • если тип свойства не является коллекцией или непосредственно типом Object, обработчик XAML попытается преобразовать его в этот тип, используя преобразователь типа. Неудавшееся преобразование вызовет ошибку времени компиляции.

  • Если тип свойства является коллекцией, а внутренний текст непрерывен (без промежуточных тегов элементов), внутренний текст разбирается как единая строка String. Если тип "Коллекция" не может принять строку String, это также вызовет ошибку времени компиляции.

  • Если тип свойства — Object, внутренний текст разбирается как единая строка String. Если встречаются промежуточные теги элементов, вызывается ошибка времени компиляции, так как тип Object подразумевает отдельный единый объект (String или другие).

  • Если тип свойства является коллекцией, а внутренний текст прерывается, первая подстрока преобразуется в тип String и добавляется в качестве элемента коллекции; затем в коллекцию добавляется промежуточный элемент и, наконец, в коллекцию добавляется конечная подстрока (если таковая имеется) в качестве третьего элемента String.

Пробел и модели текстового содержимого

На практике единственной проблемой для подмножества всевозможных моделей содержимого является только сохранение символа пробела. Это подмножество состоит из моделей содержимого, которые могут принимать одноэлементный тип String в некоторых формах, специальную коллекцию String либо сочетание String с другими типами в коллекции IList или ICollection<T>.

Даже для моделей содержимого, которые могут принимать строки, любой оставшийся пробельный символ в этих моделях содержимого по умолчанию не считается значимым. Например, объект ListBox принимает IList, но символы пробелов (такие как символы переноса строки между каждым элементом ListBoxItem) не сохраняются и не отображаются, и попытка использовать символы переноса строки в качестве разделителей между строками для элементов ListBoxItem ни к чему не приводит; строки, разделенные символами переноса строки, считаются одной строкой и одним элементом.

Коллекции, которые обрабатывают пробелы как значащие символы, обычно являются частью модели документа нефиксированного формата. Основной коллекцией, которая поддерживает принцип сохранения пробелов, является InlineCollection. Класс этой коллекции объявлен с атрибутом WhitespaceSignificantCollectionAttribute; при обнаружении этого атрибута обработчик XAML обработает пробелы этой коллекции как значащие символы. Совместное использование xml:space="preserve" и пробела в указанной коллекции WhitespaceSignificantCollectionAttribute приводит к тому, что ВСЕ пробелы сохраняются и отображаются. Совместное использование xml:space="default" и пробела в атрибуте WhitespaceSignificantCollectionAttribute приведет к начальной нормализации символов пробелов, описанной выше, которая оставит по одному пробелу в определенных позициях (эти пробельные символы сохранятся и отобразятся). Для выбора предпочтительного режима следует избирательно использовать xml:space.

Кроме того, некоторые встроенные элементы, имеющие отношение к переносу строки в модели документа нефиксированного формата, намеренно не должны отображать лишние пробелы даже в коллекции значащих символов пробелов. Например, элемент LineBreak имеет то же назначение, что и тег <BR/> в HTML. Для удобства чтения в разметке элемент LineBreak обычно отделяется от последующего текста созданным символом перевода строки. Перевод строки не должен преобразовываться в начальный пробел в следующей строке. Чтобы обеспечить это поведение, в определении класса для элемента LineBreak применяется атрибут TrimSurroundingWhitespaceAttribute, который затем интерпретируется обработчиком XAML таким образом, что пробелы вокруг элемента LineBreak всегда обрезаются.

Сохранение символа пробела

Для сохранения в окончательном представлении пробелов исходного XAML, не обработанных при нормализации пробелов обработчиком XAML, существует несколько методов.

xml:space="preserve". Укажите этот атрибут на уровне элемента, где необходимо сохранение пробелов. Обратите внимание, что это сохранит все пробелы, включая пробелы, которые могут быть добавлены редактором кода при выравнивании элементов для улучшения визуального восприятия, но отображение этих пробелов зависит от модели содержимого для содержащего элемента. Указание xml:space="preserve" на корневом уровне не рекомендуется, поскольку большинство объектных моделей не рассматривает пробелы как значащие символы тем или иным способом. Рекомендуется устанавливать этот атрибут только на уровне элементов, отображающих пробелы в пределах строк или являющихся коллекциями, рассматривающими пробелы в качестве значащих символов.

Сущности и неразрывные пробелы. XAML поддерживает размещение любой сущности Юникод в текстовой объектной модели. Можно использовать выделенные сущности, такие как неразрывный пробел (&#160; в кодировке UTF-8). Можно также использовать элементы управления форматированного текста, поддерживающие неразрывные пробельные символы. Следует соблюдать осторожность при использовании сущностей для моделирования элементов разметки, таких как отступы, поскольку выходные данные сущности времени выполнения будут различаться в зависимости от большего количества факторов, чем в случае использования общих элементов разметки (использование по назначению панелей и полей). Например, сущности сопоставляются со шрифтами и могут изменять размер в ответ на выбор шрифта пользователем.

Символы восточно-азиатских языков

Подмножество "Символы восточно-азиатских языков" определяется как набор символов Юникод в диапазоне от U+20000 до U+2FFFD и от U+30000 до U+3FFFD. Это подмножество также иногда называют "CJK-иероглифами". Дополнительные сведения содержатся на веб-узле http://www.unicode.org.

См. также

Основные понятия

Общие сведения о XAML

Ссылки

Сущности знаков XML и XAML

Обработка xml:space в языке XAML