Traitement d’espace blanc 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 :
Les caractères de flux de lignes entre les caractères d’Asie de l’Est sont supprimés. Consultez la section « Caractères d’Asie de l’Est » plus loin dans cette rubrique pour obtenir une définition de ce terme.
Tous les espaces blancs (espace, saut de ligne, onglet) sont convertis en espaces.
Tous les espaces consécutifs sont supprimés et remplacés par un espace.
Un espace immédiatement après la balise de début est supprimé.
Espace juste avant la suppression de la balise de fin.
« Default » correspond à l’état indiqué 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 trouvé 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 le convertir en ce type à l’aide de son convertisseur de type. Une conversion ayant échoué ici provoque une erreur au moment de la compilation.
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é sous la forme d’une seule String. Si le type de collection ne peut pas accepter String, cela provoque également une erreur au moment de la compilation.
Si le type de la propriété est Object, le texte interne est analysé sous la forme d’une seule String. S’il existe des balises d’élément intermédiaires, cela provoque une erreur au moment de la compilation, 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 un 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 enfin la sous-chaîne de fin (le cas échéant) est ajoutée à la collection en tant que troisième String élément.
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 conserve tous les espaces blancs, qui incluent les espaces qui peuvent être ajoutés par les applications de modification de code pour aligner les éléments « joli-imprimer » comme un imbrication visuellement intuitif. Toutefois, si ces espaces sont rendus sont déterminés par le modèle de contenu de l’élément conteneur. Évitez de spécifier xml:space="preserve"
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. Définir xml:space
globalement peut avoir des conséquences sur les performances sur le 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 non cassants. Vous devez être prudent si vous utilisez des entités pour simuler des caractéristiques de disposition telles que la mise en retrait, car la sortie au moment de l’exécution des entités varie en fonction d’un plus grand nombre de facteurs que les fonctionnalités de production de retrait entraînent un système de disposition classique, comme l’utilisation appropriée des panneaux et des marges. Par exemple, les entités sont mappées aux polices et peuvent modifier la taille en réponse à la sélection de polices 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 également parfois appelé « idéogrammes CJK ». Pour plus d’informations, consultez https://www.unicode.org.
Espaces blancs et modèles de contenu de texte
Dans la pratique, la préservation de l’espace blanc concerne uniquement un sous-ensemble de tous les modèles de contenu possibles. Ce sous-ensemble est composé de modèles de contenu qui peuvent prendre un type singleton String sous une forme, 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 modèles de contenu texte dans WPF
À des fins d’illustration, le reste de cette section fait 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, vous pouvez expérimenter un balisage XAML WPF, afficher les résultats dans un graphe d’objet, puis rééririser le balisage.
Même pour les modèles de contenu qui peuvent prendre des chaînes, le comportement par défaut dans ces modèles de contenu est que tout espace blanc qui reste n’est pas traité comme significatif. Par exemple, ListBox prend un IList, mais l’espace blanc (tel que les flux de lignes entre chaque ListBoxItem) n’est pas conservé et non rendu. Si vous tentez d’utiliser des flux de lignes comme séparateurs entre des chaînes pour ListBoxItem éléments, cela ne fonctionne pas du tout ; les chaînes séparées par les flux de lignes 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 de xml:space="preserve"
et d’espace blanc dans une collection WhitespaceSignificantCollectionAttribute indiquée est que tous les espaces blancs sont conservés et rendus. La combinaison de xml:space="default"
et d’espace blanc dans un 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. Quel comportement est souhaitable, et vous devez utiliser xml:space
de manière sélective pour activer le comportement souhaité.
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 une lisibilité dans le balisage, généralement un LineBreak est séparé de tout texte ultérieur par un flux de lignes créé. Ce flux de lignes 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 la TrimSurroundingWhitespaceAttribute, qui est ensuite interprétée par le processeur XAML pour signifier que l’espace blanc entourant LineBreak est toujours rogné.
Voir aussi
- vue d’ensemble XAML (WPF .NET)
- entités de caractères XML et XAML
- gestion xml :space dans le XAML
.NET Desktop feedback