imani-cの日記

WPFスタイルとテンプレートの本をAmazonで出しました。ちょっととっつきにくいこれらについて知りたいお方は、覗いてみてください。「WPF スタイル」で検索すると、トップに出ます。gRPCの本もあります。「gRPC入門」で検索するとすぐ見つかります。

WPF - TextBlock.Inlines

TextBlockに表示する文字列は、Text属性以外にInlinesに置くこともできます。Inlinesを使うと、文字列をいくつかの部分に分解して指定することができ、それぞれに色や装飾を付けられます。 もっとも簡単な例は、以下のようなものです。

<!-- Inlinesに置く書き方 -->
<TextBlock>
    String to Show
</TextBlock>

一見Text属性に文字列を指定したように見えますが、そうではありません。文字列の部分は、Xamlパーサーにより以下のように解釈されます。

<!-- 省略なしのInlines -->
<TextBlock>
    <TextBlock.Inlines>
        <Run Text="String to Show"/>
    </TextBlock.Inlines>
</TextBlock>

Run要素が部分的な文字列を指定します。後で説明するように、色や装飾をRun要素単位で指定できます。

文字列をRunに収めるか否かは割と自由に決められます。以下のように混ぜて書いても正しく解釈されます。

<!-- Runがあったりなかったり -->
<TextBlock>
    <Run Text="String"/> to
    <Run Text="Show"/>
</TextBlock>

このいい加減な書き方では、ソースコード上の改行は、空白1文字と解釈されます。ですから、このコードは、改行や行頭のタブ文字が無視されて、やはり「String to Show」を指定していることになります。

Inlinesに置ける要素

Inlines要素の中には、以下の要素を置くことができます。

要素名 働き
Run 文字列とその装飾を指定する。
LineBreak 改行する。
Span いくつかの要素の装飾をまとめて指定する。
InlineUIContainer 任意のコントロールを配置する。

Run

Runは、表示する文字列と装飾を指定します。

指定できる装飾と指定方法は、TextBlockとほぼ同じです。

装飾の種類 属性
フォント FontFamily, FontSize, FontStyle, FontWeight
Foreground, Background
その他 TextDecorations, TextEffects

フォントと色の指定については、TextBlockの説明を見てください。TextDecorationsとTextEffectsは、別の記事で紹介する予定です。

<TextBlock>
    <Run Text="String" Foreground="Red"/>
    <LineBreak/>
    to show
</TextBlock>

f:id:imani-c:20220418083647p:plain
RunとLineBreak

LineBreak

改行します。上図に例が出ています。

InlineUIContainer

任意のコントロールをTextBlock内に表示します。本当に何でも置けますが、TextBlockの役割を考えると、やむを得ない時にボタンなどを1個配置するなどに留めるべきでしょう。

<TextBlock Background="LightGray">
    <Run Text="String to Show"/>
    <InlineUIContainer>
        <StackPanel Orientation="Vertical">
            <Button Content="This is button"/>
            <Button Content="This is second button"/>
        </StackPanel>
    </InlineUIContainer>
</TextBlock>

f:id:imani-c:20220418083705p:plain
InlineUIContainer
上記の例では、InlineUIContainer内にStackPanelを使って二つのボタンを配置しています。このような使い方をするには、相当な理由が必要と感じます。