2011-09-14 33 views
5

私はWindowsFormsHostにForms.DataVisualization.Charting.Chartを持っています。マウスホイールのイベントを受け取るためのグラフを取得できません。私はForms.TextBoxを試してみると、マウスホイールも動きます。私は "ネイティブ"フォームアプリでチャートを使用する場合、マウスホイールも動作しています。WindowsFormsHostのフォームグラフにマウスホイールが表示されませんか?

問題は、formsHost内のフォームグラフの組み合わせです。

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Name="TextBlock1" Grid.Column="1" /> 
    <WindowsFormsHost Name="WindowsFormsHost1" Grid.Column="0"/> 
</Grid> 

と背後にあるコード:

public MainWindow() 
    { 
     InitializeComponent(); 

     var chart = new Chart() { BackColor = System.Drawing.Color.Aquamarine}; 
     WindowsFormsHost1.Child = chart; 

     chart.MouseDown += (a, b) => TextBlock1.Text += "FORMS click\r\n"; 
     TextBlock1.MouseDown += (a, b) => TextBlock1.Text += "WPF click\r\n"; 

     chart.MouseWheel += (a, b) => TextBlock1.Text += "FORMS wheel\r\n"; 
     TextBlock1.MouseWheel += (a, b) => TextBlock1.Text += "WPF wheel\r\n"; 
    } 

は私がすべてのクリックやWPFからマウスホイールを受け取ることができますが、ノーホイールからここ

は、問題を再現するためにverryシンプルなアプリケーションですフォーム。私は、フォームのホイールリスナーを成功させずに試しました。

アイデア?ジョン・スケート?

答えて

2

これは、Windowsフォーム(WinForms)とWPFの間の一般的な相互運用性の問題です。 WPFイベントは異なる動作をしますが、Windowsフォームの古いイベント処理の代わりにルーテッドイベントを使用します。

WinForms自体は、Win32ワールドからのメッセージ処理のマップです。したがって、WPFでWindowsFormsコントロールを埋め込むときは、手動でコードを作成する必要があります。マウスクリック以外のマウスイベント(マウスホイールを含む)を処理するには、winformsイベントを代用する必要があります。 .NET 4の

MSDNライブラリはこれを明確に言及した:

サロゲートWindowsがデフォルトではメッセージループに

フォーム、System.Windows.Forms.Applicationクラスはの主なメッセージ ループが含まれていますWindows Formsアプリケーション。相互運用中に、 Windowsフォームメッセージループはメッセージを処理しません。したがって、この 論理を再現する必要があります。 ComponentDispatcher.ThreadFilterMessageイベントのハンドラは、次の ステップを実行します。

1. IMessageFilterインターフェイスを使用してメッセージをフィルタします。

2. Control.PreProcessMessageメソッドを呼び出します。

3.必要に応じて、メッセージを翻訳してディスパッチします。

4.他のコントロールがない場合は、メッセージをホスティングコントロールに渡します。 メッセージを処理します。

ウィンドウハンドルが破棄されると、WindowsFormsHostコントロールは自身を登録から削除します。 http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

がご説明いただきありがとうございます、それは問題をsolfingに私をたくさん助けない:

詳細情報については、ご覧ください。私はイベントを手動で迂回する必要があると思うが、私は方法を知らない。私はまたフォームに自分のコマンドを送信するためにWPFでマウスホイールをキャプチャしようとしましたが、私はWPFでホイールをキャプチャすることができません...実際に問題を克服する方法をコードスニペットまたはアイデアを提供できますか? –

関連する問題