Compartir a través de


Procesamiento de espacios en blanco en XAML

Las reglas de lenguaje para el estado XAML que deben procesarse espacios en blanco significativos mediante una implementación del procesador XAML. En este artículo se documentan estas reglas de lenguaje XAML. También documenta un control adicional del espacio en blanco definido por la implementación de Windows Presentation Foundation (WPF) del procesador XAML y el escritor XAML para la serialización.

Definición de espacio en blanco

Coherente con XML, los caracteres de espacio en blanco en XAML son espacio, avance de línea y tabulación. Estos corresponden a los valores Unicode 0020, 000A y 0009 respectivamente.

Normalización de espacios en blanco

De forma predeterminada, la siguiente normalización del espacio en blanco se produce cuando un procesador XAML procesa un archivo XAML:

  1. Se quitan los caracteres de salto de línea entre caracteres del Este asiático. Vea la sección "Caracteres asiáticos orientales" más adelante en este tema para obtener una definición de este término.

  2. Todos los caracteres de espacio en blanco (espacio, salto de línea, tabulación) se convierten en espacios.

  3. Todos los espacios consecutivos se eliminan y reemplazan por un solo espacio.

  4. Se elimina un espacio inmediatamente después de la etiqueta de inicio.

  5. Espacio inmediatamente antes de eliminar la etiqueta final.

"Default" corresponde al estado indicado por el valor predeterminado del atributo xml:space.

Espacio en blanco en texto interno y primitivos de cadena

Las reglas de normalización anteriores se aplican al texto interno que se encuentra dentro de los elementos XAML. Después de la normalización, un procesador XAML convierte cualquier texto interno en un tipo adecuado de la siguiente manera:

  • Si el tipo de la propiedad no es una colección, pero no es directamente un tipo de Object, el procesador XAML intenta convertir a ese tipo mediante su convertidor de tipos. Una conversión con error aquí provoca un error en tiempo de compilación.

  • Si el tipo de la propiedad es una colección y el texto interno es contiguo (sin etiquetas de elemento intermedias), el texto interno se analiza como una sola String. Si el tipo de colección no puede aceptar String, esto también provoca un error en tiempo de compilación.

  • Si el tipo de la propiedad es Object, el texto interno se analiza como un solo String. Si hay etiquetas de elemento intermedias, esto provoca un error en tiempo de compilación porque el tipo de Object implica un único objeto (String o de lo contrario).

  • Si el tipo de la propiedad es una colección y el texto interno no es contiguo, la primera subcadena se convierte en un String y se agrega como un elemento de colección, el elemento intermedio se agrega como un elemento de colección y, por último, la subcadena final (si existe) se agrega a la colección como un tercer elemento de String.

Conservación del espacio en blanco

Hay varias técnicas para conservar el espacio en blanco en el XAML de origen para la presentación final que no se ve afectada por la normalización del espacio en blanco del procesador XAML.

xml:space="preserve": especifique este atributo en el nivel del elemento en el que se desea conservar el espacio en blanco. Esto conserva todo el espacio en blanco, que incluye los espacios que podrían agregarse mediante aplicaciones de edición de código a elementos de alineación "bastante impresos" como un anidamiento visualmente intuitivo. Sin embargo, si esos espacios representan están determinados por el modelo de contenido para el elemento contenedor. Evite especificar xml:space="preserve" en el nivel raíz porque la mayoría de los modelos de objetos no tienen en cuenta el espacio en blanco como significativo, independientemente de cómo establezca el atributo. Establecer xml:space globalmente puede tener consecuencias de rendimiento en el procesamiento XAML (especialmente la serialización) en algunas implementaciones. Es recomendable establecer solo el atributo en el nivel de elementos que representan espacios en blanco dentro de cadenas o que son colecciones significativas para espacios en blanco.

Entidades y espacios no importantes: XAML admite la colocación de cualquier entidad Unicode dentro de un modelo de objetos de texto. Puede usar entidades dedicadas, como el espacio sin separación (  en codificación UTF-8). También puede usar controles de texto enriquecido que admitan caracteres de espacio sin separación. Debe tener cuidado si usa entidades para simular características de diseño como la sangría, ya que la salida en tiempo de ejecución de las entidades variará en función de un mayor número de factores que las funcionalidades para producir resultados de sangría en un sistema de diseño típico, como el uso adecuado de paneles y márgenes. Por ejemplo, las entidades se asignan a fuentes y pueden cambiar el tamaño en respuesta a la selección de fuentes del usuario.

Caracteres asiáticos orientales

"Caracteres asiáticos orientales" se define como un conjunto de intervalos de caracteres Unicode U+20000 a U+2FFFD y U+30000 a U+3FFFD. Este subconjunto también se conoce a veces como "ideógrafos CJK". Para obtener más información, consulte https://www.unicode.org.

Modelos de contenido de texto y espacios en blanco

En la práctica, conservar el espacio en blanco solo es importante para un subconjunto de todos los modelos de contenido posibles. Ese subconjunto se compone de modelos de contenido que pueden tomar un tipo singleton String de alguna forma, una colección de String dedicada o una mezcla de String y otros tipos en una colección IList o ICollection<T>.

Espacios en blanco y modelos de contenido de texto en WPF

Para fines ilustrativos, el resto de esta sección hace referencia a tipos concretos definidos por WPF. Las características de control de espacios en blanco que se describen en este artículo son pertinentes para los servicios XAML de .NET y WPF. Para ver este comportamiento en acción, podría experimentar con algún marcado XAML de WPF, ver los resultados en un gráfico de objetos y volver a serializar para volver a marcar.

Incluso para los modelos de contenido que pueden tomar cadenas, el comportamiento predeterminado dentro de estos modelos de contenido es que cualquier espacio en blanco que permanezca no se trate como significativo. Por ejemplo, ListBox toma un IList, pero el espacio en blanco (como saltos de línea entre cada ListBoxItem) no se conserva y no se representa. Si intenta usar saltos de línea como separadores entre cadenas para elementos de ListBoxItem, no funciona en absoluto; Las cadenas separadas por los saltos de línea se tratan como una cadena y un elemento.

Las colecciones que tratan el espacio en blanco como significativa suelen formar parte del modelo de documento de flujo. La colección principal que admite el comportamiento de conservación de espacios en blanco es InlineCollection. Esta clase de colección se declara con el WhitespaceSignificantCollectionAttribute; cuando se encuentra este atributo, el procesador XAML tratará el espacio en blanco dentro de la colección como significativo. La combinación de xml:space="preserve" y espacios en blanco dentro de una colección WhitespaceSignificantCollectionAttribute denotada es que todos los espacios en blanco se conservan y representan. La combinación de xml:space="default" y espacio en blanco dentro de una WhitespaceSignificantCollectionAttribute provoca la normalización inicial del espacio en blanco descrita anteriormente, que deja un espacio en determinadas posiciones, y esos espacios se conservan y representan. Qué comportamiento es deseable y debe usar xml:space de forma selectiva para habilitar el comportamiento que desee.

Además, ciertos elementos insertados que denotan un salto de línea en un modelo de documento de flujo no deben introducir deliberadamente un espacio adicional incluso en una colección significativa de espacios en blanco. Por ejemplo, el elemento LineBreak tiene el mismo propósito que la etiqueta BR/> de <en HTML y, para mejorar la legibilidad en el marcado, normalmente un LineBreak está separado de cualquier texto posterior por un avance de línea creado. Ese suministro de líneas no debe normalizarse para convertirse en un espacio inicial en la línea posterior. Para habilitar ese comportamiento, la definición de clase para el elemento LineBreak aplica el TrimSurroundingWhitespaceAttribute, que después interpreta el procesador XAML para indicar que el espacio en blanco que rodea a LineBreak siempre se recorta.

Consulte también