XAML での空白の処理White-space processing in XAML

XAML は、有意な空白がXAMLXAMLプロセッサ実装によって処理される必要があることを示す言語規則です。The language rules for XAML state that significant white space must be processed by a XAMLXAML processor implementation. ここでは、それらの XAML 言語規則について説明します。This topic documents these XAML language rules. また、xaml プロセッサのWindows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)実装およびシリアル化用の xaml ライターによって定義される追加の空白文字の処理についても説明します。It also documents additional white space handling that is defined by the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) implementation of the XAML processor and the XAML writer for serialization.

空白の定義White-space definition

XAMLXAMLXMLXML、空白文字、改行、およびタブが使用されています。これらは、それぞれ UnicodeUnicode 値の 0020、000A、および 0009 に対応します。Consistent with XMLXML, white-space characters in XAMLXAML are space, linefeed, and tab. These correspond to the UnicodeUnicode values 0020, 000A, and 0009 respectively.

空白の正規化White-space normalization

既定では、プロセッサがXAMLXAMLファイルをXAMLXAML処理するときに、次の空白の正規化が行われます。By default the following white-space normalization occurs when a XAMLXAML processor processes a XAMLXAML file:

  1. 東アジア言語の文字間の改行文字が削除されます。Linefeed characters between East Asian characters are removed. この用語の定義については、後の「東アジア言語の文字」を参照してください。See the "East Asian Characters" section later in this topic for a definition of this term.

  2. すべての空白文字 (スペース、改行、タブ) は、スペースに変換されます。All white-space characters (space, linefeed, tab) are converted into spaces.

  3. 連続した複数のスペースはすべて削除され、1 つのスペースに置換されます。All consecutive spaces are deleted and replaced by one space.

  4. 開始タグの直後にあるスペースは削除されます。A space immediately following the start tag is deleted.

  5. 終了タグの直前にあるスペースは削除されます。A space immediately before the end tag is deleted.

"既定" とは、 xml:space 属性の既定値で表される状態に対応します。"Default" corresponds to the state denoted by the default value of the xml:space attribute.

内部テキスト内の空白、および文字列プリミティブWhite space in inner text, and string primitives

前の正規化規則は、XAML 要素内で検出された内部テキストに適用されます。The previous normalization rules apply to inner text that is found within XAML elements. 正規化の後、XAML プロセッサは、次のようにして、すべての内部テキストを適切な型に変換します。After normalization, a XAML processor converts any inner text into an appropriate type as follows:

  • プロパティの型がコレクションでなく、直接的に Object 型でもない場合、XAML プロセッサはその型の型コンバーターを使用して、その型への変換を試みます。If the type of the property is not a collection but is not directly an Object type, the XAML processor attempts to convert to that type by using its type converter. その際、変換に失敗すると、コンパイル時のエラーが発生します。A failed conversion here causes a compile-time error.

  • プロパティの型がコレクションで、内部テキストが連続している (間に要素タグがない) 場合、その内部テキストは単一の Stringとして解析されます。If the type of the property is a collection and the inner text is contiguous (no intervening element tags), the inner text is parsed as a single String. そのコレクション型が Stringを受け入れない場合にも、コンパイル時のエラーが発生します。If the collection type cannot accept String, this also causes a compile-time error.

  • プロパティの型が Objectである場合、その内部テキストは単一の Stringとして解析されます。If the type of the property is Object, the inner text is parsed as a single String. その内部テキストの中に要素タグが含まれている場合には、コンパイル時のエラーが発生します。これは、 Object 型は単一のオブジェクト (String またはそれ以外) であることを意味しているためです。If there are intervening element tags, this causes a compile-time error because the Object type implies a single object (String or otherwise).

  • プロパティの型がコレクションであり、内部テキストが連続していないことがあります。この場合、最初の部分文字列は String に変換されてコレクション項目として追加されます。中間にある要素はコレクション項目として追加され、この要素の後に続く部分文字列 (存在する場合) は 3 番目の String 項目としてコレクションに追加されます。If the type of the property is a collection, and the inner text is not contiguous, the first substring is converted into a String and added as a collection item, the intervening element is added as a collection item, and finally the trailing substring (if any) is added to the collection as a third String item.

保持 (空白を)Preserving white space

プロセッサの空白の正規化のXAMLXAML影響を受けない最終的なプレゼンテーションのために、ソースの空白を維持するための手法がいくつかあります。 XAMLXAMLThere are several techniques for preserving white space in the source XAMLXAML for eventual presentation that are not affected by XAMLXAML processor white-space normalization.

xml:space="preserve" :この属性は、空白を保持する必要がある要素のレベルで指定します。xml:space="preserve": Specify this attribute at the level of the element where white-space preservation is desired. この場合、要素を視覚的にわかりやすい入れ子として "美しく表示する" ためにコード編集アプリケーションによって追加されたスペースも含めて、すべての空白が保持されます。This preserves all white space, which includes the spaces that might be added by code-editing applications to "pretty-print" align elements as a visually intuitive nesting. ただし、これらのスペースが表示されるかどうかは、スペースを含んでいる要素のコンテンツ モデルによって決まります。However, whether those spaces render is determined by the content model for the containing element. 属性のxml:space="preserve"設定方法に関係なく、ほとんどのオブジェクトモデルでは空白を考慮しないため、ルートレベルでを指定することは避けてください。Avoid specifying xml:space="preserve" at the root level because most object models do not consider white space as significant regardless of how you set the attribute. グローバルに xml:space を設定すると、一部の実装で XAML 処理 (特にシリアル化) のパフォーマンスに影響することがあります。Setting xml:space globally may have performance consequences on XAML processing (particularly serialization) in some implementations. 属性は、文字列内の空白を表示する要素のレベルでのみ設定することをお勧めします。または、空白の有意なコレクションである場合にのみ設定することをお勧めします。It is a better practice to only set the attribute specifically at the level of elements that render white space within strings, or are white-space significant collections.

エンティティおよび改行しないスペース: XAMLXAML では、テキスト オブジェクト モデル内に任意の UnicodeUnicode エンティティを配置できます。Entities and non breaking spaces: XAMLXAML supports placing any UnicodeUnicode entity within a text object model. 非区切り領域 (  utf-8 エンコード) などの専用エンティティを使用できます。You can use dedicated entities such as nonbreaking space (  in UTF-8 encoding). また、改行しないスペース文字をサポートするリッチ テキスト コントロールを使用することもできます。You can also use rich text controls that support nonbreaking space characters. インデントなどのレイアウト特性をシミュレートするためにエンティティを使用する場合には、エンティティの実行時出力が、一般的なレイアウト システムにおけるインデントの生成機能を使用した場合よりも多くの要因 (パネルや余白の適切な使用など) に基づいて変化するため、注意が必要です。You should be cautious if you are using entities to simulate layout characteristics such as indention, because the run-time output of the entities will vary based on a greater number of factors than would the capabilities for producing indention results in a typical layout system, such as proper use of panels and margins. たとえば、エンティティはフォントにマッピングされ、ユーザーのフォント選択に応じてサイズが変わる可能性があります。For instance, entities are mapped to fonts and can change size in response to user font selection.

東アジア言語の文字East Asian characters

"東アジア言語の文字" は、U+20000 ~ U+2FFFD および U+30000 ~ U+3FFFD の範囲の UnicodeUnicode 文字のセットとして定義されています。"East Asian characters" is defined as a set of UnicodeUnicode character ranges U+20000 to U+2FFFD and U+30000 to U+3FFFD. このサブセットは、「CJK 表意文字」と呼ばれることもあります。This subset is also sometimes referred to as "CJK ideographs". 詳細については、「 https://www.unicode.org 」を参照してください。For more information, see https://www.unicode.org.

空白とテキストコンテンツモデルWhite space and text content models

実際には、空白の保持は、すべての可能なコンテンツモデルのサブセットについてのみ問題になります。In practice, preserving white space is only of concern for a subset of all possible content models. このサブセットに含まれるのは、ある種のシングルトン String 型、専用の String コレクション、または StringIList コレクションでの ICollection<T> と他の型の組み合わせをとることのできるコンテンツ モデルです。That subset is composed of content models that can take a singleton String type in some form, a dedicated String collection, or a mixture of String and other types in an IList or ICollection<T> collection.

WPF での空白とテキストコンテンツモデルWhite space and text content models in WPF

一例として、このセクションの残りの部分では、WPF によって定義されている特定の型について説明します。For illustration purposes, the remainder of this section references particular types that are defined by WPF. このトピックで説明する空白の処理機能は、通常、.NET Framework XAML サービスと WPF の両方に関連します。The white-space handling features that are described in this topic are generally pertinent to both .NET Framework XAML Services and WPF. これらの動作を実際に見るには、何かの WPF XAML マークアップを使用し、オブジェクト グラフでその結果を確認し、再度マークアップにシリアル化してください。To see this behavior in action, you might experiment with some WPF XAML markup, view the results in an object graph, and then serialize back to markup again.

文字列を受け取ることができるコンテンツモデルの場合でも、これらのコンテンツモデル内の既定の動作では、残っている空白は重要なものとして扱われません。Even for content models that can take strings, the default behavior within these content models is that any white space that remains is not treated as significant. たとえば、 ListBoxはをIList受け取りますが、空白 (各ListBoxItemの間の改行など) は保持されず、レンダリングされません。For example, ListBox takes an IList, but the white space (such as linefeeds between each ListBoxItem) is not preserved and not rendered. 改行文字を ListBoxItem 項目の文字列間の区切り記号として使用しても、まったく機能しません。改行文字で区切られた文字列は、1 つの文字列および 1 つの項目として扱われます。If you attempt to use linefeeds as separators between strings for ListBoxItem items, it does not work at all; the strings that are separated by the linefeeds are treated as one string and one item.

空白を有意として扱うコレクションは、通常、フロードキュメントモデルの一部です。Those collections that do treat white space as significant are typically part of the flow document model. 空白を保持する動作をサポートするプライマリコレクションはInlineCollectionです。The primary collection that supports white-space preservation behavior is InlineCollection. このコレクションクラスは、を使用WhitespaceSignificantCollectionAttributeして宣言されます。このXAMLXAML属性が検出されると、プロセッサはコレクション内の空白を有意として扱います。This collection class is declared with the WhitespaceSignificantCollectionAttribute; when this attribute is found, the XAMLXAML processor will treat white space within the collection as significant. 表記されxml:space="preserve"たコレクションWhitespaceSignificantCollectionAttribute内のとの空白の組み合わせは、すべての空白が保持され、レンダリングされることを示します。The combination of xml:space="preserve" and white space within a WhitespaceSignificantCollectionAttribute denoted collection is that all white space is preserved and rendered. との空白xml:space="default" WhitespaceSignificantCollectionAttributeの組み合わせにより、前に説明した最初の空白の正規化が行われ、特定の位置に1つのスペースが残されます。これらのスペースは保持され、レンダリングされます。The combination of xml:space="default" and white space within a WhitespaceSignificantCollectionAttribute causes the initial white-space normalization described earlier, which leaves one space in certain positions, and those spaces are preserved and rendered. どちらの動作が望ましいかは、開発者の意図によって異なります。そのため、 xml:space は、必要な動作が有効となるように、選択的に使用する必要があります。Which behavior is desirable is up to you, and you should use xml:space selectively to enable the behavior that you want.

また、フロードキュメントモデルで linebreak を意味する特定のインライン要素では、空白の有意なコレクションでも余分なスペースを導入しないようにする必要があります。Also, certain inline elements that connote a linebreak in a flow document model should deliberately not introduce an extra space even in a white-space significant collection. たとえば、要素はLineBreak HTML の<BR/> タグと同じ目的を持ち、マークアップで読みやすくするために、通常LineBreak 、は、作成された改行によって後続のテキストから分離されています。For example, the LineBreak element has the same purpose as the <BR/> tag in HTML, and for readability in markup, typically a LineBreak is separated from any subsequent text by an authored linefeed. その改行は、正規化されて後続の行の先頭のスペースになってはなりません。That linefeed should not be normalized to become a leading space in the subsequent line. この動作を有効にLineBreakするために、要素のクラス定義はをTrimSurroundingWhitespaceAttribute適用します。これXAMLXAMLは、を囲むLineBreak空白が常にトリムされることを意味するためにプロセッサによって解釈されます。To enable that behavior, the class definition for the LineBreak element applies the TrimSurroundingWhitespaceAttribute, which is then interpreted by the XAMLXAML processor to mean that white space surrounding LineBreak is always trimmed.

関連項目See also