Compartilhar via


Processamento de espaço em branco em XAML

As regras de linguagem para XAML afirmam que um espaço em branco significativo deve ser processado por uma implementação de processador XAML. Este artigo documenta essas regras de linguagem XAML. Ele também documenta a manipulação de espaço em branco adicional definida pela implementação do WPF (Windows Presentation Foundation) do processador XAML e do gravador XAML para serialização.

Definição de espaço em branco

Consistente com XML, os caracteres de espaço em branco em XAML são espaço, alimentação de linha e guia. Eles correspondem aos valores Unicode 0020, 000A e 0009, respectivamente.

Normalização de espaço em branco

Por padrão, a seguinte normalização de espaço em branco ocorre quando um processador XAML processa um arquivo XAML:

  1. Caracteres de alimentação de linha entre caracteres do Leste Asiático são removidos. Consulte a seção "Caracteres do Leste Asiático" mais adiante neste tópico para obter uma definição deste termo.

  2. Todos os caracteres de espaço em branco (espaço, alimentação de linha, guia) são convertidos em espaços.

  3. Todos os espaços consecutivos são excluídos e substituídos por um espaço.

  4. Um espaço imediatamente após a marca inicial é excluído.

  5. Um espaço imediatamente antes da marca final ser excluída.

"Padrão" corresponde ao estado indicado pelo valor padrão do atributo xml:space.

Espaço em branco no texto interno e primitivos de cadeia de caracteres

As regras de normalização anteriores se aplicam ao texto interno encontrado em elementos XAML. Após a normalização, um processador XAML converte qualquer texto interno em um tipo apropriado da seguinte maneira:

  • Se o tipo da propriedade não for uma coleção, mas não for diretamente um tipo Object, o processador XAML tentará converter para esse tipo usando seu conversor de tipo. Uma conversão com falha aqui causa um erro de tempo de compilação.

  • Se o tipo da propriedade for uma coleção e o texto interno for contíguo (sem marcas de elemento intervindo), o texto interno será analisado como um único String. Se o tipo de coleção não puder aceitar String, isso também causará um erro de tempo de compilação.

  • Se o tipo da propriedade for Object, o texto interno será analisado como um único String. Se houver marcas de elemento intervindo, isso causará um erro de tempo de compilação porque o tipo de Object implica um único objeto (String ou não).

  • Se o tipo da propriedade for uma coleção e o texto interno não for contíguo, a primeira subcadeia de caracteres será convertida em um String e adicionada como um item de coleção, o elemento interveninte será adicionado como um item de coleção e, por fim, a subcadeia de caracteres à direita (se houver) será adicionada à coleção como um terceiro item String.

Preservando o espaço em branco

Há várias técnicas para preservar o espaço em branco no XAML de origem para uma eventual apresentação que não são afetadas pela normalização do espaço em branco do processador XAML.

xml:space="preserve": especifique esse atributo no nível do elemento em que a preservação do espaço em branco é desejada. Isso preserva todo o espaço em branco, que inclui os espaços que podem ser adicionados por aplicativos de edição de código para alinhar elementos "bastante impressos" como um aninhamento visualmente intuitivo. No entanto, se a renderização desses espaços é determinada pelo modelo de conteúdo para o elemento que contém. Evite especificar xml:space="preserve" no nível raiz porque a maioria dos modelos de objeto não considera o espaço em branco como significativo, independentemente de como você define o atributo. Definir xml:space globalmente pode ter consequências de desempenho no processamento XAML (particularmente serialização) em algumas implementações. É uma prática melhor definir apenas o atributo especificamente no nível de elementos que renderizam espaço em branco dentro de cadeias de caracteres ou são coleções significativas de espaço em branco.

Entidades e espaços sem interrupção: o XAML dá suporte à colocação de qualquer entidade Unicode em um modelo de objeto de texto. Você pode usar entidades dedicadas, como espaço sem quebra (&nº 160; na codificação UTF-8). Você também pode usar controles de rich text que dão suporte a caracteres de espaço sem quebra. Você deve ser cauteloso se estiver usando entidades para simular características de layout, como recuo, pois a saída em tempo de execução das entidades variará com base em um número maior de fatores do que os recursos para produzir recuos resultam em um sistema de layout típico, como o uso adequado de painéis e margens. Por exemplo, as entidades são mapeadas para fontes e podem alterar o tamanho em resposta à seleção de fonte do usuário.

Caracteres do Leste Asiático

"Caracteres do Leste Asiático" é definido como um conjunto de intervalos de caracteres Unicode U+20000 a U+2FFFD e U+30000 a U+3FFFD. Esse subconjunto também é às vezes chamado de "ideógrafos CJK". Para obter mais informações, consulte https://www.unicode.org.

Modelos de conteúdo de texto e espaço em branco

Na prática, preservar o espaço em branco é apenas uma preocupação para um subconjunto de todos os modelos de conteúdo possíveis. Esse subconjunto é composto por modelos de conteúdo que podem usar um tipo de String singleton em alguma forma, uma coleção de String dedicada ou uma mistura de String e outros tipos em uma coleção IList ou ICollection<T>.

Modelos de conteúdo de texto e espaço em branco no WPF

Para fins ilustrativos, o restante desta seção faz referência a tipos específicos definidos pelo WPF. Os recursos de tratamento de espaço em branco descritos neste artigo são pertinentes aos Serviços XAML do .NET e ao WPF. Para ver esse comportamento em ação, você pode experimentar alguma marcação XAML do WPF, exibir os resultados em um grafo de objeto e, em seguida, serializar novamente para marcação.

Mesmo para modelos de conteúdo que podem levar cadeias de caracteres, o comportamento padrão nesses modelos de conteúdo é que qualquer espaço em branco restante não é tratado como significativo. Por exemplo, ListBox usa um IList, mas o espaço em branco (como alimentações de linha entre cada ListBoxItem) não é preservado e não renderizado. Se você tentar usar os feeds de linha como separadores entre cadeias de caracteres para itens ListBoxItem, ele não funcionará; as cadeias de caracteres separadas pelos feeds de linha são tratadas como uma cadeia de caracteres e um item.

Essas coleções que tratam o espaço em branco como significativo normalmente fazem parte do modelo de documento de fluxo. A coleção primária que dá suporte ao comportamento de preservação de espaço em branco é InlineCollection. Esta classe de coleção é declarada com o WhitespaceSignificantCollectionAttribute; quando esse atributo for encontrado, o processador XAML tratará o espaço em branco dentro da coleção como significativo. A combinação de xml:space="preserve" e espaço em branco em uma coleção WhitespaceSignificantCollectionAttribute indicada é que todo o espaço em branco é preservado e renderizado. A combinação de xml:space="default" e espaço em branco dentro de uma WhitespaceSignificantCollectionAttribute causa a normalização inicial de espaço em branco descrita anteriormente, o que deixa um espaço em determinadas posições, e esses espaços são preservados e renderizados. Qual comportamento é desejável cabe a você e você deve usar xml:space seletivamente para habilitar o comportamento desejado.

Além disso, determinados elementos embutidos que connotam uma quebra de linha em um modelo de documento de fluxo deliberadamente não devem introduzir um espaço extra mesmo em uma coleção significativa de espaço em branco. Por exemplo, o elemento LineBreak tem a mesma finalidade que a marca <BR/> em HTML e, para legibilidade na marcação, normalmente um LineBreak é separado de qualquer texto subsequente por um linefeed criado. Esse feed de linha não deve ser normalizado para se tornar um espaço à esquerda na linha subsequente. Para habilitar esse comportamento, a definição de classe para o elemento LineBreak aplica o TrimSurroundingWhitespaceAttribute, que é interpretado pelo processador XAML para significar que o espaço em branco ao redor LineBreak é sempre cortado.

Consulte também