WPFになってから、UIレイアウトの自由度が高まりましたが、それでもWindowsForm時代のコンポーネントを使いたくなることがあります。
例えば、グラフを表示するチャートコントロールがWPFで標準搭載されていないとか、WindowsFormのDataGridViewよりWPFのDataGirdの方が表示速度が遅いとか、WindowsForm時代に作った自作コントロールを使いたいとか・・・
理由は色々ありますが、WindowsForm時代のコントロールを使いたいというニーズを解決する方法として、WPFではWindowsFormsHostというコントロールが用意されています。
今回は、これについて解説したいと思います。
WindowsFormsHost とは
WPFではUIのアーキティクチャが大幅に変わったため、WindowsFromsで使われていたコントロールもWPF様に刷新されています。
このタイミングで、チャートコントロール(MSChart)やチェックボックスなど、いくつかのコントロールが用意されなくなりました。
その代わりに、WPFのUIとWindowsForms時代のコントロールの橋渡し(=ホスト)を行い、WPFからWindowsFormのコントロールを使えるようにするコントールがWindowsFormsHostと呼ばれるものです。
WindowsFormsHostの使い方
使い方は次の3ステップで行います。
- System.Windows.From.dll の参照設定を行う
- ツールボックスにある「WindowsFormsHost」をドラッグ&ドロップでデザイナーに張り付ける
- XAMLを編集し使いたいWindowsFormsのコントロールをWindowsFormsHostタグに記述する。
では1つづつみやってみましょう。
Step1.参照設定を行う
ソリューションエクスプローラーの「①参照」をクリックし、表示されるメニューの一番上の「②参照の追加」をクリックする。
参照マネージャが表示されるので、「③アセンブリ」をクリックし、名前の一覧をスクロールさせて「System.Windows.Forms」を見つけます。
見つかったら、その行をクリック「④チェック」して、最後に「⑤OK」ボタンをクリックすると完了です。
Step2.WindowsFormsHostを張り付ける
ツールボックスの下の方に「WindowsFormsHost」がありますので、これをデザイナーにドラッグ&ドロップします。
1つのWindowsFormsHostに対して、1つのWindowsFormコントロールしか記述できませんので、使いたい数だけWindowsFormsHost を張り付けて下さい。
Step3.XAML上のWindowsFormsHostタグにコントロールを記述する
参照設定したからといって、WindowsFormsのコントロールがツールボックスに表示されるわけではありません。
XAMLを直接編集する必要があります。
まず最初に参照設定を行うのですが、XAMLの先頭に xmlns:~で始まる行が数行あるとおもいますので、その中のどこかに下記の1行を追加します。
1 2 |
xmlns:wfc ="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" |
次に、WindowsFormsHostのタグを見つけて、使いたいコントロールを次の様に記述します。
ちなみに、この例はDataGridViewを参照する例です。
1 2 3 |
<WindowsFormsHost HorizontalAlignment="Left" Height="141" Margin="86,41,0,0" VerticalAlignment="Top" Width="272"> <wfc:DataGridView x:Name="MyDataGridView" /> </WindowsFormsHost> |
x:Nameでコントロールの名前を “MyDataGridView”に設定していますので、C#のコード上から "MyDataGridView"という名前でアクセスできるようになります。
制限事項
WindowsFormsHostは、あくまでも橋渡し役の存在であるため、WindowsFormsで使っている時と100%同じように使えるかと言うと、そうではありません。
少なからず制限というものがあります。
例えば、WPFのコントロールと同時に使う場合、WindowsFormsHostが常に一番上に来てしまいます。
また、コントロールによっては、マウスイベントが発生しない(WindowsForm側のコントロールに届かない)とか、WindowsForm側のコントロールでサイズ指定できない(代わりにWindowsFormsHost側でサイズ指定する)などの制約もあります。
グーグルで検索しても制約に関する記事が少ないので、普通に使う分にはそこそこ使えそうですが、あくまでも救済処置として考えておく方がよさそうです。
使いどころとしては、WPFで用意されていないコントロール、例えばMSChartであるとか、WPFでのDataGridだと速度が遅いのでDataGridViewを使いたいとか、そういうケースで利用を検討するのが良いかもしれません。
ちなみに、MSChartでWindowsFormsHostを使いましたが、特にマウスイベントが来ないという不具合もなく、今のところ問題無く使えています。
まとめ
WPFでWindowsFormのコントロールが使いたい場合、WindowsFormsHost を経由して使うことが出来ます。
手順は次の3ステップです。
- System.Windows.Formsの参照設定、
- WindowsFormsHostの貼り付け
- XAML上でWindowsFormsHostタグに使いたいコントロールを記述
100%同じように使えるわけでは無く、コントロールによって何らかの制限が発生する場合があるので、あくまでも救済処置であることを念頭に置いておく必要はありますが、それほど手の込んだ使い方をしなければ、十分実用に耐えられます。
WPFでは非搭載となったMSChartコントロールや、一覧表示でDataGridより表示速度を出したい時などに使えば、かなりメリットがあるのではないかと思います。