Traitement des espaces blancs en XAML

Règles de langage pour l’état XAML qui doivent être traitées par une implémentation de processeur XAML. Cet article documente ces règles de langage XAML. Il documente également une gestion supplémentaire de l’espace blanc défini par l’implémentation WPF (Windows Presentation Foundation) du processeur XAML et de l’enregistreur XAML pour la sérialisation.

Définition d’espace blanc

Cohérent avec les caractères XML, les espaces blancs en XAML sont des espaces, un flux de lignes et un onglet. Ces valeurs correspondent respectivement aux valeurs Unicode 0020, 000A et 0009.

Normalisation de l’espace blanc

Par défaut, la normalisation de l’espace blanc suivant se produit lorsqu’un processeur XAML traite un fichier XAML :

  1. Les caractères de saut de ligne entre les caractères d'Extrême-Orient sont supprimés. Consultez la section « Caractères d'Extrême-Orient », plus loin dans cette rubrique, pour obtenir une définition de ce terme.

  2. Tous les espaces blancs (espace, saut de ligne, onglet) sont convertis en espaces.

  3. Tous les espaces consécutifs sont supprimés et remplacés par un espace.

  4. Un espace qui suit immédiatement la balise de début est supprimé.

  5. Un espace qui précède immédiatement la balise de fin est supprimé.

La « valeur par défaut » correspond à l'état désigné par la valeur par défaut de l'attribut xml:space .

Espace blanc dans le texte interne et primitives de chaîne

Les règles de normalisation précédentes s'appliquent au texte interne que l'on trouve dans les éléments XAML. Après la normalisation, un processeur XAML convertit tout texte interne en un type approprié, comme suit :

  • Si le type de la propriété n'est pas une collection, mais n'est pas directement un type Object , le processeur XAML tente de convertir en ce type à l'aide de son convertisseur de type. En cas d'échec de la conversion, une erreur de compilation survient.

  • Si le type de la propriété est une collection et que le texte interne est contigu (aucune balise d'élément intermédiaire), le texte interne est analysé comme un élément StringString. Si le type de collection ne peut pas accepter String, une erreur de compilation est également générée.

  • Si le type de la propriété est Object, le texte interne est analysé comme un objet Stringunique. En cas de balises d'élément intermédiaires, une erreur de compilation est générée car le type Object implique un objet unique (String ou autre).

  • Si le type de la propriété est une collection et que le texte interne n'est pas contigu, la première sous-chaîne est convertie en String et ajoutée en tant qu'élément de collection, l'élément intermédiaire est ajouté en tant qu'élément de collection et la sous-chaîne de fin (le cas échéant) est ajoutée à la collection comme troisième élément String .

Conservation de l’espace blanc

Il existe plusieurs techniques pour préserver l’espace blanc dans le code XAML source pour une présentation éventuelle qui ne sont pas affectées par la normalisation de l’espace blanc du processeur XAML.

xml :space="preserve » : spécifiez cet attribut au niveau de l’élément où la conservation de l’espace blanc est souhaitée. Cela permet de conserver l'ensemble de l'espace blanc, ce qui inclut les espaces pouvant être ajoutés par des applications d'édition de code pour imprimer correctement des éléments comme une imbrication visuellement intuitive. Toutefois, le rendu de ces espaces est déterminé par le modèle de contenu pour l'élément conteneur. Évitez de xml:space="preserve" spécifier au niveau racine, car la plupart des modèles objet ne considèrent pas l’espace blanc comme significatif, quelle que soit la façon dont vous définissez l’attribut. Le fait de définir xml:space de façon globale peut avoir des conséquences sur les performances de traitement XAML (en particulier, la sérialisation) dans certaines implémentations. Il est préférable de définir uniquement l’attribut spécifiquement au niveau des éléments qui restituent des espaces blancs dans des chaînes ou sont des collections significatives d’espaces blancs.

Entités et espaces non cassants : XAML prend en charge le placement d’une entité Unicode dans un modèle objet texte. Vous pouvez utiliser des entités dédiées telles que l’espace insécable (  ; dans l’encodage UTF-8). Vous pouvez également utiliser des contrôles de texte enrichi qui prennent en charge les caractères d'espace insécable. Soyez prudent lorsque vous utilisez des entités pour simuler des caractéristiques de mise en page telles que la mise en retrait, car la sortie à l'exécution des entités variera suivant que le nombre de facteurs est plus élevé que les fonctionnalités de mise en page générales, telles que l'utilisation appropriée de panneaux et de marges. Par exemple, les entités sont mappées aux polices et peuvent changer de taille en fonction de la police sélectionnée par l'utilisateur.

Caractères d’Asie orientale

Les « caractères d’Asie orientale » sont définis comme un ensemble de plages de caractères Unicode U+20000 à U+2FFFD et U+30000 à U+3FFFD. Ce sous-ensemble est parfois également appelé « idéogrammes CJK ». Pour plus d’informations, consultez https://www.unicode.org.

Espaces blancs et con mode tente ls de texte

Dans la pratique, la préservation de l’espace blanc ne concerne qu’un sous-ensemble de tous les con mode tente ls possibles. Ce sous-ensemble se compose des modèles de contenu qui peuvent prendre un type String singleton d'une certaine manière, une collection String dédiée ou un mélange de String et d'autres types dans une collection IList ou ICollection<T> .

Espaces blancs et con mode tente ls dans WPF

À des fins d'illustration, le reste de cette section référence des types particuliers définis par WPF. Les fonctionnalités de gestion des espaces blancs décrites dans cet article sont pertinentes pour les services XAML .NET et WPF. Pour voir ce comportement en action, il peut se révéler utile d'expérimenter des balises XAML WPF et de consulter les résultats dans un graphique d'objets, puis de procéder une nouvelle fois à une désérialisation en balises.

Même pour les c mode tente ls qui peuvent prendre des chaînes, le comportement par défaut dans ces con mode tente ls est que tout espace blanc qui reste n’est pas traité comme significatif. Par exemple, prend un IListespace blanc (par exemple, ListBox les flux de lignes entre chaqueListBoxItem) n’est pas conservé et non rendu. Si vous tentez d'utiliser des sauts de ligne comme séparateurs entre des chaînes pour les éléments ListBoxItem , cela ne fonctionne pas du tout ; les chaînes séparées par des sauts de ligne sont traitées comme une chaîne et un élément.

Ces collections qui traitent l’espace blanc comme étant significatives font généralement partie du modèle de document de flux. La collection principale qui prend en charge le comportement de préservation de l’espace blanc est InlineCollection. Cette classe de collection est déclarée avec le WhitespaceSignificantCollectionAttribute; lorsque cet attribut est trouvé, le processeur XAML traite l’espace blanc dans la collection comme significatif. La combinaison d’espaces et d’espaces xml:space="preserve" blancs dans une WhitespaceSignificantCollectionAttribute collection indiquée est que tous les espaces blancs sont conservés et rendus. La combinaison d’espaces xml:space="default" blancs dans un espace WhitespaceSignificantCollectionAttribute provoque la normalisation initiale de l’espace blanc décrit précédemment, ce qui laisse un espace dans certaines positions, et ces espaces sont conservés et rendus. À vous de déterminer le comportement souhaité et d'utiliser xml:space de manière sélective pour activer le comportement de votre choix.

En outre, certains éléments inline qui indiquent un saut de ligne dans un modèle de document de flux ne doivent pas introduire délibérément un espace supplémentaire même dans une collection significative d’espace blanc. Par exemple, l’élément LineBreak a le même objectif que la <balise BR/> en HTML et, pour la lisibilité dans le balisage, il LineBreak est généralement séparé de tout texte ultérieur par un flux de lignes créé. Ce saut de ligne ne doit pas être normalisé pour devenir un espace de début dans la ligne suivante. Pour activer ce comportement, la définition de classe de l’élément LineBreak applique le TrimSurroundingWhitespaceAttribute, qui est ensuite interprété par le processeur XAML pour signifier que l’espace blanc entourant LineBreak est toujours rogné.

Voir aussi