WPF で 上下左右に中央寄せのラベル(テキストボックス)を作る

C#

WPF で上下左右(水平垂直方向)に中央寄せするラベルの作り方でハマったので備忘録です。
調べてもなかなかでてこなかった・・

やりたいこと

ずばり、以下の絵のようなやつです。

f:id:tassi-yuzukko:20190304092323p:plain

解決策

以下の自動翻訳されたページに答えがありました。

codeday.me

上記絵のようにするには、XAML を以下のように書きます。

<StackPanel>
    <Border BorderBrush="Black" Height="200" Margin="30" BorderThickness="1">
        <TextBlock Text="Some Text" VerticalAlignment="Center" Width="100" TextAlignment="Center" />
    </Border>
</StackPanel>

ポイントとしては以下です。

  • 一見テキストボックスが大きいように見えるが、実体としては Border コントロールが大きくて、 Textbox 自体は小さい
  • Textbox は VerticalAlignment="Center" にすることで垂直方向に中央寄せすることはできますが、その場合「高さが1行分」という条件が発生する。もし Textbox 自体の高さを変更すると中央寄せにならない
  • そのため、Border 自体を大きくして、見た目上 Textbox の高さを大きくしているようにする

ちなみに、上記で Border の境界線が不要ならば、BorderBrush="{x:Null}" とすることで境界線なしに出来ます。

補足(というか愚痴)

なお、レガシーな GUI アプリを作ってきたものからすると、こういう用途では「Label」を使用するイメージだったのですが、ラベルは「文字を水平方向にセンタライズできない」という謎仕様があるため、こういう用途では使えないっぽいです。

WPF は自由度高いと言いつつ、規定のコントロールごとに出来ること出来ないことに差がありすぎてツライです・・・
そういうことしたい人はカスタムコントロール作ればいいじゃんって話なのかもしれませんが。(私はコスト高いから嫌だよねーって思っちゃいます)

コメント

タイトルとURLをコピーしました