C#のWPFでActiveXコントロールを使う

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 更新