XAML и пустое пространство

В этом разделе вы научитесь обрабатывать пустое пространство в XAML.

Обработка пустого пространства

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

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

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

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

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

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

Пустое пространство и модели текстового содержимого

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

Даже для моделей содержимого, которые могут принимать строки, поведение по умолчанию заключается в том, что любой оставшийся пробел не рассматривается как значащий.

Сохранение пустого пространства

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

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

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