Partilhar via


Processamento de espaço em branco em XAML

As regras de linguagem para XAML afirmam que 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 adicional de espaço em branco definida pela implementação do Windows Presentation Foundation (WPF) 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 tabulação. Estes correspondem aos valores Unicode 0020, 000A e 0009, respectivamente.

Normalização do 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. Os 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 desse termo.

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

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

  4. Um espaço imediatamente após a tag de início é excluído.

  5. Um espaço imediatamente antes da tag final é excluído.

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

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

As regras de normalização anteriores aplicam-se 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 em tempo de compilação.

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

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

  • Se o tipo da propriedade for uma coleção e o texto interno não for contíguo, a primeira substring será convertida em um String e adicionada como um item de coleção, o elemento interveniente será adicionado como um item de coleção e, finalmente, a substring à 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 onde 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 de "impressão bonita" como um aninhamento visualmente intuitivo. No entanto, se esses espaços são renderizados é determinado 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 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 não separáveis: o XAML oferece suporte à colocação de qualquer entidade Unicode em um modelo de objeto de texto. Você pode usar entidades dedicadas, como espaço não separável (  na codificação UTF-8). Você também pode usar controles de rich text que suportam caracteres de espaço ininterruptos. Você deve ser cauteloso se estiver usando entidades para simular características de layout, como recuo, porque 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 resultados de recuo 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 fontes do usuário.

Personagens 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. Este subconjunto também é por vezes referido como "ideógrafos CJK". Para obter mais informações, consulte https://www.unicode.org.

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

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 ter um único tipo de String de alguma forma, uma coleção de String dedicada ou uma mistura de String e outros tipos em uma coleção IList ou ICollection<T>.

Espaço em branco e modelos de conteúdo de texto no WPF

Para fins de ilustração, o restante desta seção faz referência a tipos específicos que são definidos pelo WPF. Os recursos de manipulação 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 WPF XAML, exibir os resultados em um gráfico de objeto e, em seguida, serializar novamente para marcação novamente.

Mesmo para modelos de conteúdo que podem usar 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 leva 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 linefeeds como separadores entre cadeias de caracteres para ListBoxItem itens, isso não funciona; As cadeias de caracteres separadas pelos LineFeeds são tratadas como uma cadeia de caracteres e um item.

As 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 suporta o 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 dentro de uma coleção WhitespaceSignificantCollectionAttribute denotada é que todo o espaço em branco é preservado e renderizado. A combinação de xml:space="default" e espaço em branco dentro de um WhitespaceSignificantCollectionAttribute causa a normalização inicial do espaço em branco descrita anteriormente, que deixa um espaço em determinadas posições, e esses espaços são preservados e renderizados. Qual comportamento é desejável depende de você, e você deve usáxml:space seletivamente para habilitar o comportamento que você deseja.

Além disso, certos elementos embutidos que conotam 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 tag <BR/> em HTML e, para legibilidade na marcação, normalmente um LineBreak é separado de qualquer texto subsequente por um linefeed criado. Essa alimentação de linha não deve ser normalizada para se tornar um espaço principal 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.

Ver também