XAML での空白処理
XAML プロセッサの実装によって重要な空白を処理する必要がある XAML 状態の言語規則。 この記事では、これらの XAML 言語規則について説明します。 また、シリアル化用の XAML プロセッサと XAML ライターの Windows Presentation Foundation (WPF) 実装によって定義される追加の空白処理についても説明します。
空白の定義
XML と一致し、XAML の空白文字はスペース、改行、タブです。これらは、それぞれ Unicode 値 0020、000A、および 0009 に対応します。
空白の正規化
既定では、次の空白の正規化は、XAML プロセッサが XAML ファイルを処理するときに発生します。
東アジアの文字の間の改行文字が削除されます。 この用語の定義については、このトピックで後述する「東アジア文字」セクションを参照してください。
空白文字 (スペース、改行、タブ) はすべてスペースに変換されます。
連続するすべてのスペースは削除され、1 つのスペースに置き換えられます。
開始タグの直後のスペースが削除されます。
終了タグが削除される直前のスペース。
"Default" は、xml:space 属性の既定値で示される状態に対応します。
内部テキストの空白と文字列プリミティブ
前の正規化ルールは、XAML 要素内にある内部テキストに適用されます。 正規化後、XAML プロセッサは次のように内部テキストを適切な型に変換します。
プロパティの型がコレクションではなく、直接 Object 型でない場合、XAML プロセッサは型コンバーターを使用してその型への変換を試みます。 ここで変換に失敗すると、コンパイル時エラーが発生します。
プロパティの型がコレクションであり、内部テキストが連続している (中間要素タグがない) 場合、内部テキストは 1 つの Stringとして解析されます。 コレクション型が Stringを受け入れられない場合は、コンパイル時エラーも発生します。
プロパティの型が Object場合、内部テキストは 1 つの Stringとして解析されます。 要素タグが介在している場合、Object 型は単一のオブジェクト (String またはそれ以外の場合) を意味するため、コンパイル時エラーが発生します。
プロパティの型がコレクションであり、内部テキストが連続していない場合、最初の部分文字列が String に変換され、コレクション項目として追加され、中間要素がコレクション項目として追加され、最後に末尾の部分文字列 (存在する場合) が 3 番目の String 項目としてコレクションに追加されます。
空白の保持
XAML プロセッサの空白の正規化の影響を受けず、最終的なプレゼンテーションのためにソース XAML に空白を保持する方法はいくつかあります。
xml:space="preserve": 空白の保持が必要な要素のレベルでこの属性を指定します。 これにより、すべての空白が保持されます。これには、コード編集アプリケーションが要素を視覚的に直感的な入れ子として配置するために "pretty-print" に追加される可能性のあるスペースが含まれます。 ただし、これらのスペースがレンダリングされるかどうかは、含まれる要素のコンテンツ モデルによって決まります。 ルート レベルで xml:space="preserve"
を指定しないでください。ほとんどのオブジェクト モデルでは、属性を設定する方法に関係なく空白が重要であるとは見なされないためです。
xml:space
グローバルに設定すると、一部の実装で XAML 処理 (特にシリアル化) にパフォーマンスが低下する可能性があります。 属性は、文字列内に空白をレンダリングする要素のレベル、または空白の重要なコレクションである要素のレベルでのみ設定することをお勧めします。
エンティティと改行しないスペース: XAML では、テキスト オブジェクト モデル内に Unicode エンティティを配置できます。 非改行スペース ( 、UTF-8 エンコード) などの専用エンティティを使用できます。 改行しないスペース文字をサポートするリッチ テキスト コントロールを使用することもできます。 エンティティを使用してインデントなどのレイアウト特性をシミュレートする場合は注意が必要です。エンティティの実行時の出力は、パネルや余白の適切な使用など、一般的なレイアウト システムでインデントを生成する機能よりも多くの要因に基づいて異なるためです。 たとえば、エンティティはフォントにマップされ、ユーザーのフォント選択に応じてサイズを変更できます。
東アジアの文字
"東アジア文字" は、Unicode 文字範囲 U+20000 から U+2FFFD、U+30000 から U+3FFFD のセットとして定義されます。 このサブセットは、"CJK ideographs" とも呼ばれます。 詳細については、https://www.unicode.orgを参照してください。
空白とテキストのコンテンツ モデル
実際には、空白を保持することは、考えられるすべてのコンテンツ モデルのサブセットに対してのみ考慮されます。 そのサブセットは、シングルトン String 型を何らかの形式で受け取ることができるコンテンツ モデル、専用の String コレクション、または IList または ICollection<T> コレクション内の String とその他の型の組み合わせで構成されます。
WPF の空白とテキスト コンテンツ モデル
説明のため、このセクションの残りの部分では、WPF で定義されている特定の型を参照します。 この記事で説明する空白処理機能は、.NET XAML サービスと WPF の両方に関連しています。 この動作を実際に確認するには、いくつかの WPF XAML マークアップを試し、結果をオブジェクト グラフで表示してから、もう一度マークアップにシリアル化します。
文字列を受け取ることができるコンテンツ モデルの場合でも、これらのコンテンツ モデル内の既定の動作は、残っている空白は重要なものとして扱われません。 たとえば、ListBox は IListを受け取りますが、空白 (各 ListBoxItem間の改行など) は保持されず、レンダリングされません。 ListBoxItem 項目の文字列間の区切り記号として改行を使用しようとすると、まったく機能しません。改行で区切られた文字列は、1 つの文字列と 1 つの項目として扱われます。
空白を重要として扱うコレクションは、通常、フロー ドキュメント モデルの一部です。 空白の保持動作をサポートするプライマリ コレクションは、InlineCollectionです。 このコレクション クラスは、WhitespaceSignificantCollectionAttributeで宣言されています。この属性が見つかると、XAML プロセッサはコレクション内の空白を重要として扱います。
WhitespaceSignificantCollectionAttribute で示されるコレクション内の xml:space="preserve"
と空白の組み合わせは、すべての空白が保持され、レンダリングされるということです。
WhitespaceSignificantCollectionAttribute 内の xml:space="default"
と空白の組み合わせにより、前に説明した最初の空白の正規化が発生し、特定の位置に 1 つのスペースが残り、それらのスペースが保持されてレンダリングされます。 どの動作が望ましいかはユーザー次第です。必要な動作を有効にするには、xml:space
を選択的に使用する必要があります。
また、フロー ドキュメント モデルの改行を意味する特定のインライン要素では、空白の重要なコレクションでも、意図的に余分なスペースを導入しないようにする必要があります。 たとえば、LineBreak 要素は HTML の <BR/> タグと同じ目的を持ち、マークアップで読みやすくするために、通常、LineBreak は作成された改行によって後続のテキストから分離されます。 そのラインフィードは、後続の行の先頭スペースになるように正規化しないでください。 この動作を有効にするには、LineBreak 要素のクラス定義によって TrimSurroundingWhitespaceAttributeが適用されます。これは XAML プロセッサによって解釈され、LineBreak を囲む空白が常にトリミングされることを意味します。
関連項目
- XAML の概要 (WPF .NET)
- XML 文字エンティティと XAML を
する - XAML での xml:space 処理の
.NET Desktop feedback