Обработка пробелов в XAML
Согласно правилам языка XAML, значащие пробелы должны обрабатываться реализацией обработчика XAML. В этом разделе описываются эти правила языка XAML, а также дополнительные принципы обработки пробелов, определенные в реализации Windows Presentation Foundation (WPF) обработчика XAML и средства записи XAML для сериализации.
В этом разделе содержатся следующие подразделы.
- Определение пробела
- Нормализация пробелов
- Пробел во внутреннем тексте и строковые примитивы
- Сохранение символа пробела
- Символы восточноазиатских языков
- Пробел и модели текстового содержимого
- Связанные разделы
Определение пробела
Согласно XML, символами пробелов в XAML являются пробелы, перевод строки и табуляция. В Unicode они соответствуют значениям 0020, 000A и 0009.
Нормализация пробелов
По умолчанию при обработке обработчиком XAML файла XAML выполняется следующая нормализации пробелов.
Знаки перевода строки между восточноазиатскими символами удаляются. Определение этого термина см. в подразделе "Символы восточноазиатских языков" далее в этом разделе.
Все символы пробелов (пробел, перевод строки, табуляция) преобразуются в пробелы.
Все последовательные пробелы удаляются и заменяется одним пробелом.
Пробел, следующий непосредственно за открывающим тегом, удаляется.
Пробел, стоящий непосредственно перед закрывающим тегом, удаляется.
"Умолчание" соответствует состоянию, обозначаемому значением атрибута xml:space по умолчанию.
Пробел во внутреннем тексте и строковые примитивы
Приведенные выше правила нормализации применяются к внутреннему тексту, обнаруженному внутри элементов XAML. После нормализации обработчик XAML преобразует любой внутренний текст в соответствующий тип следующим образом.
Если тип свойства не является коллекцией, но и не является непосредственно типом Object, обработчик XAML попытается преобразовать его в этот тип, используя соответствующий преобразователь типа. Неудача преобразования вызовет ошибку времени компиляции.
Если тип свойства является коллекцией и внутренний текст не прерывается (в нем нет промежуточных тегов элементов), внутренний текст анализируется как единая строка String. Если тип коллекции не может принять строку String, это также вызовет ошибку времени компиляции.
Если тип свойства — Object, внутренний текст анализируется как единая строка String. Наличие промежуточных тегов элементов вызывает ошибку времени компиляции, так как тип Object подразумевает отдельный единый объект (String или другой).
Если тип свойства является коллекцией и внутренний текст прерывается, первая подстрока преобразуется в тип String и добавляется в качестве элемента коллекции, затем в коллекцию добавляется промежуточный элемент и, наконец, в коллекцию добавляется конечная подстрока (если таковая имеется) в качестве третьего элемента типа String.
Сохранение символа пробела
Для сохранения в окончательном представлении пробелов исходного XAML, не обработанных при нормализации пробелов обработчиком XAML, существует несколько методов.
xml:space="preserve". Укажите этот атрибут на уровне элемента, где необходимо сохранение пробелов. При этом сохраняются все пробелы, включая пробелы, которые могут быть добавлены редактором кода при выравнивании элементов для улучшения визуального восприятия. Однако то, будут ли эти пробелы визуализироваться, определяется моделью содержимого элемента-контейнера. Не рекомендуется указывать атрибут xml:space="preserve" на корневом уровне, поскольку большинство объектных моделей не рассматривает пробелы как значащие вне зависимости от того, как задан атрибут. В некоторых реализациях глобальное задание атрибута xml:space может отрицательно повлиять на производительность обработки XAML (в частности, сериализации). Рекомендуется устанавливать этот атрибут только на уровне элементов, отображающих пробелы в пределах строк или являющихся коллекциями, рассматривающими пробелы в качестве значащих символов.
Сущности и неразрывные пробелы. XAML поддерживает размещение любой сущности Unicode в текстовой объектной модели. Можно использовать выделенные сущности, такие как неразрывный пробел (  в кодировке UTF-8). Можно также использовать элементы управления текстом в формате RTF, поддерживающие знаки неразрывных пробелов. Следует соблюдать осторожность при использовании сущностей для имитации элементов структуры, таких как отступы, поскольку выходные данные времени выполнения сущностей будут варьироваться в зависимости от большего количества факторов, чем при использовании для получения отступов обычных средств структурирования, таких как панели и поля. Например, сущности сопоставляются со шрифтами и могут изменять размер в ответ на выбор шрифта пользователем.
Символы восточноазиатских языков
Подмножество "Символы восточноазиатских языков" определяется как набор символов Unicode в диапазоне от U+20000 до U+2FFFD и от U+30000 до U+3FFFD. Это подмножество также иногда называют "CJK-иероглифами". Дополнительные сведения см. на веб-узле http://www.unicode.org.
Пробел и модели текстового содержимого
На практике единственной проблемой для подмножества всевозможных моделей содержимого является только сохранение символа пробела. Это подмножество состоит из моделей содержимого, которые могут принимать одноэлементный тип String в некоторых формах, специальную коллекцию String либо сочетание String с другими типами в коллекции IList или ICollection<T>.
Пробел и модели текстового содержимого в WPF
Для наглядности оставшаяся часть этого подраздела ссылается на конкретные типы, определенные в WPF. Функции обработки пробелов, описанные в этом разделе, в большинстве случаев относятся и к службам XAML платформы .NET Framework, и к WPF. Чтобы увидеть их поведение в действии, имеет смысл поэкспериментировать с некоторой разметкой XAML в WPF, просмотреть результаты в графе объектов, а затем снова выполнить сериализацию обратно в разметку.
Даже для моделей содержимого, которые могут принимать строки, любой оставшийся пробельный символ в этих моделях содержимого по умолчанию не считается значимым. Например, элемент управления 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 всегда обрезаются.
См. также
Ссылки
Обработка xml:space в языке XAML