Share via


Procesamiento de espacios en blanco en XAML

Las reglas de lenguaje de XAML indican que una implementación de procesador XAML debe procesar un espacio en blanco significativo. En este tema se documentan estas reglas del lenguaje XAML. También se documenta el control adicional del espacio en blanco que está definido por la implementación de Windows Presentation Foundation (WPF) del procesador XAML y el sistema de escritura XAML para la serialización.

Este tema contiene las secciones siguientes.

  • Definición del espacio en blanco
  • Normalización del espacio en blanco
  • Espacio en blanco en texto interno y primitivas de cadena
  • Conservar el espacio en blanco
  • Caracteres del este asiático
  • Espacio en blanco y modelos del contenido de texto
  • Temas relacionados

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. Consulte la sección "Caracteres del este asiático" más adelante en este tema para obtener una definición de este término.

  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 normalización anteriores se aplican al texto 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, 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. Una conversión incorrecta aquí producirá 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 provoca 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, se produce 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.

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. De esta manera se conserva todo el espacio en blanco, incluidos los espacios que las aplicaciones de edición de código puedan agregar a los elementos de alineación "para impresión" como anidación visualmente intuitiva. Sin embargo, si esos espacios se presentan lo determina el modelo de contenido del elemento contenedor. Evite especificar xml:space="preserve" en el nivel raíz, porque la mayoría de los modelos de objetos no considera el espacio en blanco como significativo independientemente de cómo se establezca el atributo. La configuración global de xml:space puede tener consecuencias en el rendimiento del procesamiento XAML (en especial la serialización) en algunas implementaciones. 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 (  en la codificación UTF-8). También puede usar controles de texto enriquecido que admiten caracteres de espacio de no separación. Debe tener cuidado si usa entidades para simular características de diseño tales como la sangría, porque la salida de las entidades en tiempo de ejecución dependerá de más factores que las funciones para aplicar una sangría en un sistema de diseño típico, como el uso correcto de los paneles y los 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.

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>.

Espacio en blanco y modelos del contenido de texto en WPF

Para que sirva de ejemplo, el resto de esta sección hace referencia a los tipos determinados definidos por WPF. Las características de control del espacio en blanco que se describen en este tema normalmente guardan relación con los servicios XAML de .NET Framework y WPF. Para ver este comportamiento en acción, podría experimentar con marcado XAML de WPF, ver los resultados en un gráfico de objeto y, a continuación, serializar el marcado de nuevo.

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 cada ListBoxItem) no se conserva ni se presenta. Si intenta utilizar avances de línea como separadores entre las cadenas de elementos de ListBoxItem, no funcionará en absoluto; las cadenas que están 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 conserve y presente. La combinación de xml:space="default" y de espacio en blanco dentro de WhitespaceSignificantCollectionAttribute produce la normalización del espacio en blanco inicial descrita anteriormente, que deja un espacio en ciertas posiciones, y esos espacios se conservan y presentan. 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.

Vea también

Referencia

Entidades de caracteres XML y XAML

Control de xml:space en XAML

Conceptos

Información general sobre XAML (WPF)