web-dev-qa-db-ja.com

WPFでの実行とコンテンツとテキストの比較

WPF(またはWindows 8または8.1アプリケーション)では、コントロールにテキストを追加する方法が3つあります。

  1. Run要素内のTextBlock要素

    <TextBlock>
        <Run>My text</Run>
    </TextBlock>
    
  2. Text要素の属性としてのTextBlockプロパティ

    <TextBlock Text="My text" />
    
  3. Text要素内の要素としてのTextBlockプロパティ

    <TextBlock>
        <TextBlock.Text>my text</TextBlock.Text>
    </TextBlock>`
    

これら3つのアプローチの違いは何ですか?また、TextにはTextBlockを、ContentにはComboboxItemを使用する必要があるのはなぜですか。

18
H. Pauwelyn

Textプロパティを持つコントロールは文字列のみを受け入れ、そのコントロールによって処理される特定の方法でレンダリングされます。そのようなコントロールの例は TextBlock および TextBox です。

Contentプロパティを持つコントロールは、文字どおりそのプロパティに設定されたobjectを持つことができます。これらのコントロールは通常、値を ContentPresenterContent プロパティに転送します。 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タグの本文内にコンテンツを配置する場合のデフォルト)を設定すると、テキストをフォーマットできます。たとえば、 RunFontWeightBoldを設定して使用して、特定の単語またはフレーズを文内で太字にすることができます。 LineBreak を使用して、新しい行を挿入できます。 InlineUIContainer を使用して、カスタムUI要素をテキストに挿入することもできます。 Inline クラスから派生するものはすべて、このコレクションに入れることができます。

TextBlock は、フォーマットされたテキストの単純なビットを対象としています。さらに強力なドキュメントスタイル機能が必要な場合は、 RichTextBoxFlowDocumentScrollViewer および-などのコントロールで使用される FlowDocument を調べることができます。 FlowDocumentReader

<TextBlock Text="something" />および<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>、実際には違いはありません。これらは、xamlファイル内の何かにプロパティを設定できる2つの異なる方法です。 2番目のバージョンは通常、セッター内で追加の要素を定義する必要がある場合にのみ使用されます。

31
Xavier

「プロパティ要素」に関する短い言葉

これはザビエルの素晴らしい答えに対する追加のコメントにすぎません。

実際には、以下の間に大きな違いはありません。

<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」を直接設定できますが、他の例では、構文を使用して複合型の属性を設定できます。

4
Martin