WPF で上下左右(水平垂直方向)に中央寄せするラベルの作り方でハマったので備忘録です。
調べてもなかなかでてこなかった・・
やりたいこと
ずばり、以下の絵のようなやつです。
解決策
以下の自動翻訳されたページに答えがありました。
上記絵のようにするには、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 は自由度高いと言いつつ、規定のコントロールごとに出来ること出来ないことに差がありすぎてツライです・・・
そういうことしたい人はカスタムコントロール作ればいいじゃんって話なのかもしれませんが。(私はコスト高いから嫌だよねーって思っちゃいます)
コメント