WindowsFormsHost コンテナーでホストされている WinForms コントロールを持つ C# WPF アプリがあります。アプリを実行すると、ParentForm プロパティが NULL であるため、WinForms コントロールは OnPaint() イベント ハンドラーで何もしません。純粋な WinForms プロジェクトでは、このプロパティは NULL ではなく、コントロールが描画されたフォームに設定されます。
私の WPF プロジェクトでは、WinForms コントロールをデザイナーに表示する方法がわからないため、プロジェクト XAML ファイルを介してコントロールを追加しました。プロジェクトが実行されるとコントロールが表示されますが、前述したように、ParentForm プロパティが NULL であるため再描画されません。
メイン フォームの Window_Loaded() イベントで、WinForms コントロールの Parent プロパティを XAML ファイルの最上位の Window に設定しようとしました。ParentForm プロパティは読み取り専用であるため、使用しませんでした。ただし、コンパイラは次のエラーを表示します。
タイプ 'RawDataTestApp.Window1' を 'System.Windows.Forms.Control' に暗黙的に変換することはできません
Window1 はコントロールではないため、このエラーが発生していると思いますか? いずれにせよ、WinForms コントロールを WPF プロジェクトのメイン フォームに適切にアタッチする方法がわかりません。どうすればいいですか?プロジェクトの XAML ファイルの関連部分を以下に示します。これは、オープン ソースの C# プロジェクトからのものです。WindowsFormsHost コンテナーによってホストされるプロジェクトに、WinForms グラフ コントロールを追加しました。
// Here's the source line that gets the error. pdeAffectiv is the WinForms graphcontrol that is hosted in a WindowsFormsHost container:
pdeAffectiv.Parent = MainForm;
// -------------------------- WPF Project XAML file ----------------------------------
<!-- Copyright © 2010 James Galasyn -->
<Window x:Name="MainForm" x:Class="RawDataTestApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="EmotivEngine Realtime Client" Height="454" Width="1042" Background="#FF000033" Foreground="#FF33FFFF" xmlns:emoclient="clr-namespace:EmoEngineClientLibrary;assembly=EmoEngineClientLibrary"
xmlns:eecontrol="clr-namespace:EmoEngineControlLibrary;assembly=EmoEngineControlLibrary"
xmlns:local="clr-namespace:RawDataTestApp" Loaded="Window_Loaded" Closing="Window_Closing"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:graphlib="clr-namespace:GraphLib;assembly=GraphLib">
<Grid>
<!--- CONTENTS SNIPPED FOR BREVITY -->
<WindowsFormsHost x:Name="wfhAffectiv" HorizontalAlignment="Left" Height="148" Margin="530,75.493,0,0" VerticalAlignment="Top" Width="471" >
<graphlib:PlotterDisplayEx x:Name="pdeAffectiv" >
</graphlib:PlotterDisplayEx>
</WindowsFormsHost>
</Grid>
</Window>