WPF(またはWindows 8または8.1アプリケーション)では、コントロールにテキストを追加する方法が3つあります。
Run
要素内のTextBlock
要素
<TextBlock>
<Run>My text</Run>
</TextBlock>
Text
要素の属性としてのTextBlock
プロパティ
<TextBlock Text="My text" />
Text
要素内の要素としてのTextBlock
プロパティ
<TextBlock>
<TextBlock.Text>my text</TextBlock.Text>
</TextBlock>`
これら3つのアプローチの違いは何ですか?また、Text
にはTextBlock
を、Content
にはComboboxItem
を使用する必要があるのはなぜですか。
Text
プロパティを持つコントロールは文字列のみを受け入れ、そのコントロールによって処理される特定の方法でレンダリングされます。そのようなコントロールの例は TextBlock および TextBox です。
Content
プロパティを持つコントロールは、文字どおりそのプロパティに設定されたobject
を持つことができます。これらのコントロールは通常、値を ContentPresenter の Content プロパティに転送します。 ContentPresenter Class ドキュメントには、この関連ブロックがあります。
ContentPresenterは次のロジックを使用してコンテンツを表示します。
- ContentPresenterのContentTemplateプロパティが設定されている場合、ContentPresenterはそのDataTemplateをContentプロパティに適用し、結果のUIElementとその子要素(ある場合)が表示されます。 DataTemplateオブジェクトの詳細については、「データテンプレートの概要」を参照してください。
- ContentPresenterのContentTemplateSelectorプロパティが設定されている場合、ContentPresenterは適切なDataTemplateをContentプロパティに適用し、結果のUIElementとその子要素(ある場合)が表示されます。
- Contentのタイプに関連付けられたDataTemplateがある場合、ContentPresenterはそのDataTemplateをContentプロパティに適用し、結果のUIElementとその子要素(ある場合)が表示されます。
- ContentがUIElementオブジェクトの場合、UIElementが表示されます。 UIElementに既に親がある場合、例外が発生します。
- コンテンツのタイプをUIElementに変換するTypeConverterがある場合、ContentPresenterはそのTypeConverterを使用し、結果のUIElementが表示されます。
- Contentのタイプを文字列に変換するTypeConverterがある場合、ContentPresenterはそのTypeConverterを使用して、その文字列を含むTextBlockを作成します。 TextBlockが表示されます。
- コンテンツがXmlElementの場合、InnerTextプロパティの値はTextBlockに表示されます。
- ContentPresenterは、ContentのToStringメソッドを呼び出し、TextBlockを作成して、ToStringから返された文字列を含めます。 TextBlockが表示されます。
TextBlock クラスの場合、Text
プロパティを設定するか、Inlines
プロパティを設定するかを選択できます。 Text
を設定すると、単にテキストがレンダリングされます。 Inlines
(xamlタグの本文内にコンテンツを配置する場合のデフォルト)を設定すると、テキストをフォーマットできます。たとえば、 Run を FontWeight にBold
を設定して使用して、特定の単語またはフレーズを文内で太字にすることができます。 LineBreak を使用して、新しい行を挿入できます。 InlineUIContainer を使用して、カスタムUI要素をテキストに挿入することもできます。 Inline クラスから派生するものはすべて、このコレクションに入れることができます。
TextBlock は、フォーマットされたテキストの単純なビットを対象としています。さらに強力なドキュメントスタイル機能が必要な場合は、 RichTextBox 、 FlowDocumentScrollViewer および-などのコントロールで使用される FlowDocument を調べることができます。 FlowDocumentReader 。
<TextBlock Text="something" />
および<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>
、実際には違いはありません。これらは、xamlファイル内の何かにプロパティを設定できる2つの異なる方法です。 2番目のバージョンは通常、セッター内で追加の要素を定義する必要がある場合にのみ使用されます。
「プロパティ要素」に関する短い言葉
これはザビエルの素晴らしい答えに対する追加のコメントにすぎません。
実際には、以下の間に大きな違いはありません。
<TextBlock Text="something" />
そして
<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>
これは、Text
プロパティのタイプがString
であり、Text="something"
のように直接設定できる単純なタイプだからです。
上記の例の後者の構文は、「プロパティ要素」と呼ばれます。通常、要素の属性を複合型に設定するときに使用されます。
例:
<Button>
<Button.Content>
<Rectangle Height="20", Width="20", Fill="Black"/>
</Button.Content>
</Button>
この例では、適切にButton.Content
を使用せずに「Rectangle」を直接設定できますが、他の例では、構文を使用して複合型の属性を設定できます。