巷にもよくある情報だけど、Windows FormのアプリケーションにWPFを置く方法。
- Windows Form Applicationを作成する
- WPFのUserControlを作成する(作成後ビルドもする)
<UserControl x:Class="WinFormAndWPF.WpfContent"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Button Content="Hello world" />
</Grid>
</UserControl>
- WPF相互運用機能からElementHostをフォームに置く
- ホストするコンテンツの選択で、表示したいWPFのUserControlを選択する
- 完成(上がWPFで下が普通のWindowsFormのボタン)
フォーム上に置いたWPFのUserControlは、普通のWindows Formのコントロールと同じように、フィールドに変数が作られる。ということで、普通に使える。

タイトルの通りです。要はマージンの話。
WPFは、レイアウトを指定すると、そのレイアウトの通りにコントロールを配置してくれる。
恐らくお世話になる率が高いGridレイアウトは、大体のレイアウトをこれだけで記述できちゃうくらいパワフルな代物です。
たとえば、下のようなコードを書くと絵のような画面になります。
<UserControl x:Class="SilverlightTest2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Text="何か入れてね" />
<TextBox Grid.Row="1" AcceptsReturn="True" />
<StackPanel Grid.Row="2"
Orientation="Horizontal"
HorizontalAlignment="Right">
<Button Content="決定" />
<Button Content="キャンセル" />
</StackPanel>
</Grid>
</UserControl>

割とありがちな、画面の説明のためのテキストと入力欄とOKなのかNGなのかを選択するためのボタンがあるタイプの画面です。なんというか、敷き詰められた感があって手抜き感たっぷりに感じてしまう。
何かの番組(今もしてるのかな?)に出てきそうな「ゆとりの空間魔術師」とまでは行かなくても、普通にそれっぽい隙間は入れたいと思うのは人間の性。そういうときに、マージンを使います。
マージンを指定するのは簡単で、Marginプロパティに値を設定するだけ。四方に同じマージンを指定する場合は、単純に値を1つ設定するだけでいいようになってる。
たとえば、ボタンやテキストボックスの周りに幅5のマージンが欲しかったら下のようにすればいい。
<TextBlock Grid.Row="0" Text="何か入れてね" />
<TextBox Grid.Row="1" AcceptsReturn="True" />
<StackPanel Grid.Row="2"
Margin="5"
Orientation="Horizontal"
HorizontalAlignment="Right">
<Button Margin="5" Content="決定" />
<Button Margin="5" Content="キャンセル" />
</StackPanel>
一律に5とったもんだから、若干不自然な感じもするけど、隙間は開いた。こんな風に調整していけばピッチピチに詰まった画面じゃなくなる。後はセンスの問題だ!
ちなみに、マージンの指定方法には知ってるだけだと下のような指定方法がある。
多分これで全部じゃないかな…?
Margin="5":上下左右に5
Margin="5,10":左右に5、上下に10
Margin="10,20,30,40":左に10、上に20、右に30、下に40
ここら辺の変換は、Marginプロパティにコンバータがしかけてあるのだろう。実際のMarginプロパティの型はLeft,Top,Right,Bottomというdouble型のプロパティを持つThickness構造体であらわされてる。
C#からマージンを指定する場合は、この型を使うことになる。
7月もはじまった!初日からいきなり、プロジェクトの現地へ出張だった。
プロジェクトのメンバーじゃないけど、問題が起きたらいくのがうちの部署。
ということで、早めに終わって無事帰宅。らっき~!ということで6月のページビューです。
日, PV
2008/06/01 1684
2008/06/02 2472
2008/06/03 2768
2008/06/04 2447
2008/06/05 2377
2008/06/06 2661
2008/06/07 1391
2008/06/08 1405
2008/06/09 2824
2008/06/10 2697
2008/06/11 2389
2008/06/12 2566
2008/06/13 2356
2008/06/14 1501
2008/06/15 1365
2008/06/16 2618
2008/06/17 2333
2008/06/18 2188
2008/06/19 2779
2008/06/20 2762
2008/06/21 1349
2008/06/22 1241
2008/06/23 2739
2008/06/24 2524
2008/06/25 2518
2008/06/26 2508
2008/06/27 2553
2008/06/28 1256
2008/06/29 1397
2008/06/30 2410
合計 60992ページビュー
検索で、たまたまたどり着いた方や、見に来て頂いてるかた、どうもありがとうございました。
今月も変わらず、アレを続けると思ったら今度はコレか!ってくらいの幅広さでやっていけたらと思います。