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

Языковые правила для состояния XAML, что значительное пробелы должны обрабатываться реализацией обработчика XAML. В этой статье описаны эти правила языка XAML. Он также документирует дополнительную обработку пробелов, определяемую реализацией обработчика XAML Presentation Foundation (WPF) и модуля записи XAML для сериализации.

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

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

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

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

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

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

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

  4. Пробел после открывающего тега удаляется.

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

"Default" соответствует состоянию, обозначаемому значением атрибута 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 поддерживает размещение любой сущности Юникода в текстовой объектной модели. Вы можете использовать выделенные сущности, такие как неразрывное пространство (  в кодировке UTF-8). Можно также использовать элементы управления форматированным текстом, поддерживающие неразрывные пробелы. Следует соблюдать осторожность при использовании сущностей для имитации характеристики разметки, таких как отступы, поскольку выходные данные сущностей во время выполнения зависят от множества факторов, при этом возможности формирования получения отступов в типичной системе разметки, например правильное использование панелей и полей, ограничены. Например, сущности сопоставляются со шрифтами и могут изменять размер после выбора шрифта пользователем.

Восточноазиатские символы

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

Пробелы и текстовые con режим палатки ls

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

Пробелы и текстовые con режим палатки ls в WPF

Для наглядности оставшаяся часть этого подраздела ссылается на конкретные типы, определенные в WPF. Функции обработки пробелов, описанные в этой статье, относятся как к службам XAML .NET, так и к WPF. Чтобы увидеть это в действии, можно поэкспериментировать с некоторой разметкой WPF XAML, просмотреть результаты в графе объектов и снова сериализовать их в разметку.

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

Эти коллекции, которые обрабатывают пробелы как значительные, обычно являются частью модели документа потока. Основная коллекция, поддерживающая поведение сохранения пробелов, — это InlineCollection. Этот класс коллекции объявляется с WhitespaceSignificantCollectionAttributeпомощью атрибута. При обнаружении этого атрибута обработчик XAML будет обрабатывать пробелы в коллекции как значительные. Сочетание пробелов и пробелов xml:space="preserve" в обозначенной WhitespaceSignificantCollectionAttribute коллекции заключается в том, что все пробелы сохраняются и отрисовывается. Сочетание пробелов и пробелов вызывает WhitespaceSignificantCollectionAttribute начальную нормализацию пробеловxml:space="default", описанную ранее, которая оставляет одно пространство в определенных позициях, и эти пробелы сохраняются и отрисовываются. Предпочтительное для вас поведение выбираете вы. Следует выборочно использовать xml:space , чтобы включить желаемое поведение.

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

См. также