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 que é 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. 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. 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 linha, tabulação) 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 de início é excluído.

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

"Padrão" 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 se aplicam ao texto interno encontrado nos 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 Object tipo, 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 interveniente), 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 em tempo de compilação.

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

  • 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 e adicionada como um item de coleção, o elemento interveniente será adicionado como um item de coleção e, finalmente, a subcadeia de caracteres à direita (se houver) será adicionada à coleção como um String terceiro String item.

Preservando espaço em branco

Há várias técnicas para preservar o espaço em branco no XAML de origem para 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 de espaço em branco é desejada. Isso preserva todo o espaço em branco, o 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, a renderização desses espaços é determinada pelo modelo de conteúdo do 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. A configuração xml:space global pode ter consequências de desempenho no processamento XAML (particularmente serialização) em algumas implementações. É uma prática melhor definir o atributo especificamente apenas 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 ininterrupto (  na codificação UTF-8). Você também pode usar controles rich text que oferecem suporte a 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 fonte 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.

Espaço em branco e modelos de 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 usar um único String tipo de uma única forma ou uma coleção dedicada String ou uma mistura de String outros tipos em uma IList ou ICollection<T> coleção.

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 XAML do WPF, exibir os resultados em um gráfico de objeto e, em seguida, serializar novamente para a marcação.

Mesmo para modelos de conteúdo que podem assumir cadeias de caracteres, o comportamento padrão dentro desses modelos de conteúdo é que qualquer espaço em branco que permaneça não é tratado como significativo. Por exemplo, usa um IList, ListBox 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 funcionará de forma alguma: as cadeias de caracteres separadas pelas alimentações de linha serão tratadas como uma cadeia de caracteres e um item.

As coleções que tratam o espaço em branco como significativo geralmente fazem parte do modelo de documento de fluxo. A coleção primária que oferece suporte ao comportamento de preservação de espaço em branco é InlineCollection. Essa classe de coleção é declarada com o ; quando esse atributo for encontrado, o processador XAML tratará o WhitespaceSignificantCollectionAttributeespaço em branco dentro da coleção como significativo. A combinação de e espaço em branco dentro de uma WhitespaceSignificantCollectionAttribute coleção denotada xml:space="preserve" é que todo o espaço em branco é preservado e renderizado. A combinação de um espaço em branco dentro de um causa a normalização inicial de xml:space="default" espaço em branco descrita anteriormente, que deixa um WhitespaceSignificantCollectionAttribute 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 usar xml:space seletivamente para habilitar o comportamento desejado.

Além disso, certos elementos embutidos que conotam uma quebra de linha em um modelo de documento de fluxo não devem deliberadamente introduzir um espaço extra, mesmo em uma coleção significativa de espaço em branco. Por exemplo, o LineBreak elemento tem a mesma finalidade que a tag BR/> em HTML e, para facilitar a leitura na marcação, normalmente a <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 aplica o , que é interpretado pelo processador XAML para significar que o LineBreakTrimSurroundingWhitespaceAttributeespaço em branco ao redor LineBreak é sempre cortado.

Confira também