WindowsにはActiveXコントロールというものがあります。
ActiveXコントロールとはMicrosoftが開発したソフトウェアを部品化する技術だそうで、この技術を使ってMicrosoftだけでなくサードパーティなどからも様々なコントロール作成されていたりします。
ではそのActiveXコントロールをWPFで作成したアプリから利用するにはどうすれば良いのでしょう。
WPFは直接ActiceXコントロールを持てない
WPFには直接ActiceXコントロールを配置する手段はありません。
ただし、直接は無理でも間接的には可能です。Windowsフォームを間にはさむ事でWPFで作成されたアプリにActiveXコントロールを埋め込み利用する事が出来るようになります。
Windowsフォーム経由でActiveXコントロールを使う
WPFにはWindowsFormsHostクラスというものがあります。
このクラスはWindowsフォームのコントロールをWPFのウィンドウやページの中に配置する為のコントロールです。
WindowsFormsHostコントロールにWindowsフォームのユーザーコントロールを埋め込み、そのユーザーコントロールにActiveXコントロールを埋め込むという感じで作り込んでいきます。
手順は以下の通りです。
アセンブリWindowsFormsIntegrationの参照を追加する
WindowsFormsHostコントロールを使うためにはWindowsFormsIntegrationというアセンブリへの参照を追加する必要があります。
Visual Studioのメニューから[プロジェクト(P)]→[参照の追加(R)...]を選び参照マネージャーを表示します。
参照マネージャーの左ツリーから[アセンブリ]→[フレームワーク]を選び、中央のリストから[WindowsFormsIntegration]を探してチェックを付けOKボタンをクリックします。
WPFのウィンドウへWindowsFormsHostコントロールを配置する
<RibbonWindow x:Class="WpfTest1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfTest1" mc:Ignorable="d" Title="MainWindow" Height="250" Width="250"> <WindowsFormsHost x:Name="activeXHost"> </WindowsFormsHost> </RibbonWindow>
9~10行目のようにWindowsFormsHostコントロールを配置します。
後々csコードを編集するのでx:Nameでコントロールに名前を付けておきましょう。
Windowsフォームのユーザーコントロールを作成する
Visual Studioのメニューから[プロジェクト(P)]→[ユーザーコントロールの追加(U)...]を選び、
新しい項目の追加画面からユーザーコントロールを追加します。
※WPFのユーザーコントロールではなくWindowsフォームのユーザーコントロールです
ユーザーコントロールにActiveXコントロールを張り付ける
作成したユーザーコントロールをデザイナーで開き、ツールボックス上で右クリックして[アイテムの選択(I)...]を選択しツールボックスのアイテム選択画面を表示します。
ツールボックスのアイテム選択画面で[COMコンポーネント]タブから使いたいActiveXコントロールにチェックを付けてOKボタンをクリックします。
ツールボックスに該当のActiveXコントロールが追加されるので、そこから選びユーザーコントロールへ張り付けましょう。
WindowsFormsHostへユーザーコントロールをセットする
ウィンドウのLoadedなどを使ってWindowsFormsHostコントロールへActiveXを埋め込んだユーザーコントロールをセットします。
private void Window_Loaded(object sender, RoutedEventArgs e) { TestControl testCtrl = new TestControl(); activeXHost.Child = testCtrl; }
3行目のTestControlというクラスがActveXを埋め込んだユーザーコントロールです。
TestControlを構築してWindowsFormsHostクラスのChildへセットします。
2017/10/05 更新
コメントをお書きください