かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Windows FormsからWPFやUWPに来て戸惑うこと

Buttonに文字を設定するのにTextじゃないということ。

Contentプロパティに設定しないといけないというやつですね。 ふむふむ、コンテンツね…って覚えたらTextBlockはTextプロパティなのかよ!という理不尽な扱いを受けてしまいます。

これの見分け方なんですが、文字列以外も表示したいというものはContentというケースが多いです。例えばButtonって画像表示したりしたいですよね?ListBoxItem(ListBoxの1要素)にもテキスト1行じゃなくて複数行テキストと画像とかを組み合わせて表示したいですよね(WinFormsだとオーナードローとか使ってたケース)

そういったケースに対応するためにContentを設定するコントロール(親を辿っていくとContentControlというのに行きつきます)があります。こいつの何がすごいって適当なものを設定したら、いい感じに解釈して表示してくれるところです。画像なら画像。コントロールとかを設定したらコントロール、文字列を設定したら文字列みたいな。

詳しくは以下の記事を見てみて下さい。

blog.okazuki.jp

ContentPresenter クラス (System.Windows.Controls)

このContentというプロパティへの抵抗が無くなったら割とすんなり次のステップにいけるのではないかと思います。 次のステップはレイアウトコントロールですね。

XAML系プラットフォームでは、WinFormsのときみたいな絶対値とアンカー(だっけ)の指定とかで位置を決めるのではなく、Panel(複数のコントロール)をまとめて配置する責任を持ったコントロールがあります。縦や横に並べたり、折り返して並べたり、格子状に区切られた領域に配置したりetc...。

こうすることで、要素を結構柔軟に配置することができます。しかも簡単に。 WinFormsだと、サイズ変更イベントとかをハンドリングして位置計算してたようなものでも、割とさくっとくめたりします。

レイアウトコントロールについては以下を見てみてください。

blog.okazuki.jp

blog.okazuki.jp

blog.okazuki.jp

blog.okazuki.jp

blog.okazuki.jp

最後にリスト系コントロールです。ListBoxとかDataGridのやつ。 これはItemsSourceというプロパティにコレクションを突っ込んだらいい感じにテンプレートにデータを当てはめて表示してくれるってやつです。ContentControlの複数表示版です。これを見ておきましょう。

blog.okazuki.jp

これで、単一項目の要素と複数項目の要素を表示ができて、それらを好きに配置できるようになります!後は必要に応じて調べていったらいいでしょう。UWPとタイトルに入ってるけど、完全にWPFの記事紹介になってますね。すいません。でも基本は同じだから!