Procesamiento de espacios en blanco en XAML

Actualización: noviembre 2007

Lenguaje de marcado de aplicaciones extensible (XAML) tiene reglas de lenguaje que especifican cómo se procesará el espacio en blanco significativo en una implementación de procesador XAML. En este tema se documentan estas reglas del lenguaje, así como la administración del espacio en blanco adicional definida por la implementación de Windows Presentation Foundation (WPF) del procesador XAML y el sistema de escritura XAML para la serialización.

Procesamiento del espacio en blanco

Definición del espacio en blanco

De modo coherente con XML, los caracteres de espacio en blanco de XAML son el espacio, el avance de línea y la tabulación. Corresponden a los valores 0020, 000A y 0009 de Unicode, respectivamente.

Normalización del espacio en blanco

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

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

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

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

  4. Se eliminan los un espacios que siguen inmediatamente a la etiqueta inicial.

  5. Se eliminan los espacios situados inmediatamente antes de la etiqueta de cierre.

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

Espacio en blanco en texto interno y primitivas de cadena

Las reglas de la normalización anteriores se aplican al texto interno situado dentro de los elementos XAML. Después de la normalización, un procesador XAML convertirá cualquier texto interno en un tipo adecuado, como se indica a continuación:

  • Si el tipo de la propiedad no es una colección, pero no es directamente un tipo Object, el procesador XAML intenta convertir en ese tipo utilizando su convertidor de tipos. Si se produce un error al convertir en este punto, dará lugar a 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 elementos intermedias), el texto interno se analiza como una sola cadena (String). Si el tipo de colección no puede aceptar String, esto también da lugar a un error en tiempo de compilación.

  • Si el tipo de la propiedad es Object, el texto interno se analiza como una sola cadena (String). Si hay etiquetas de elemento intermedias, dará lugar a un error en tiempo de compilación, porque el tipo Object implica que hay un objeto único (de tipo String u otro).

  • Si el tipo de la propiedad es una colección, y el texto interno no es contiguo, la primera subcadena se convierte en 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 la hay) se agrega a la colección como un tercer elemento de tipo String.

Espacio en blanco y modelos del contenido de texto

En la práctica, conservar el espacio en blanco sólo afecta a un subconjunto de todos los posibles modelos de contenido. Ese subconjunto está compuesto de modelos de contenido que pueden aceptar alguna forma del tipo String singleton, una colección String dedicada o una mezcla de String y otros tipos en una colección IList o ICollection<T>.

Incluso para los modelos de contenido que pueden aceptar cadenas, el comportamiento predeterminado dentro de estos modelos de contenido consiste en no tratar como significativo el espacio en blanco restante. Por ejemplo, ListBox toma IList, pero el espacio en blanco (como los avances de línea entre los ListBoxItem) no se conservan ni representan. De hecho, intentar utilizar avances de línea como separadores entre las cadenas para los elementos ListBoxItem no funciona en absoluto; las cadenas separadas por los avances de línea se tratan como una cadena y un elemento.

Aquellas colecciones que sí tratan el espacio en blanco como significativo suelen formar parte del modelo de documentos dinámicos. La colección principal que admite el comportamiento de preservación de espacio en blanco es InlineCollection. Esta clase de colección se declara con WhitespaceSignificantCollectionAttribute; cuando se encuentra este atributo, el procesador XAML tratará el espacio en blanco de la colección como significativo. La combinación de xml:space="preserve" y de espacio en blanco dentro de una colección indicada mediante WhitespaceSignificantCollectionAttribute da lugar a que TODO el espacio en blanco se conserva y representa. La combinación de xml:space="default" y de espacio en blanco dentro de WhitespaceSignificantCollectionAttribute dará lugar a la normalización del espacio en blanco inicial descrita anteriormente, que dejará un espacio en blanco en ciertas posiciones, y esos espacios en blanco se conservan y representan. El comportamiento deseable depende del programador, por lo que debe utilizar xml:space selectivamente para habilitar el comportamiento que desee.

Asimismo, algunos elementos insertados que incluyen un avance de línea en un modelo de documentos dinámicos no deben introducir deliberadamente un espacio adicional ni siquiera en una colección con espacio en blanco significativo. Por ejemplo, el elemento LineBreak tiene el mismo propósito que la etiqueta <BR/> de HTML. Para mejorar la legibilidad en el marcado, LineBreak suele separarse del texto subsiguiente mediante un avance de línea creado. Ese avance de línea no se debe normalizar para convertirlo en un espacio inicial en la línea subsiguiente. Para habilitar ese comportamiento, la definición de clase del elemento LineBreak aplica TrimSurroundingWhitespaceAttribute, que el procesador XAML interpreta como una indicación de que siempre se recorta el espacio en blanco que rodea a LineBreak.

Conservar el espacio en blanco

Hay varias técnicas para conservar el espacio en blanco en el origen XAML para la presentación, en su caso, a las que no afecta la normalización del espacio en blanco del procesador XAML.

xml:space="preserve": especifique este atributo en el nivel del elemento donde desee conservar el espacio en blanco. Tenga en cuenta que se conservará todo el espacio en blanco, incluso los espacios que puedan agregar las aplicaciones de edición de código para alinear los elementos "para impresión" en una anidación visualmente intuitiva. Sin embargo, la representación o no de estos espacios depende, una vez más, del modelo de contenido del elemento contenedor. Especificar xml:space="preserve" en el nivel raíz no se recomienda, porque, sea como fuere, la mayoría de los modelos de objetos no considera significativo el espacio en blanco. Es más recomendable limitarse a establecer el atributo específicamente en el nivel de los elementos que representan el espacio en blanco contenido en las cadenas o que son colecciones con espacio en blanco significativo.

Entidades y espacios de no separación: XAML permite colocar cualquier entidad Unicode dentro de un modelo del objetos de texto. Puede utilizar entidades dedicadas, como el espacio de no separación (&#160; en la codificación UTF-8). También puede utilizar controles de texto enriquecido que admiten caracteres de espacio de no separación. Extreme las precauciones al utilizar entidades para simular características de diseño, como la sangría, porque el resultado en tiempo de ejecución de las entidades varía en función de un número de factores mayor que en las utilidades de diseño generales, como el uso apropiado de paneles y márgenes. Por ejemplo, las entidades se asignan a fuentes y pueden cambiar de tamaño en respuesta a la selección de fuente del usuario.

Caracteres del este asiático

La definición de "caracteres del este asiático" incluye conjunto de intervalos de caracteres Unicode: de U+20000 a U+2FFFD y de U+30000 a U+3FFFD. En ocasiones, este subconjunto también se denomina "ideogramas CJK". Para obtener más información, vea http://www.unicode.org.

Vea también

Conceptos

Información general sobre XAML

Referencia

Entidades de caracteres XML y XAML

Control de xml:space en XAML