7

WindowsFormsHost に Forms.DataVisualization.Charting.Chart があります。グラフがマウス ホイール イベントを受け取ることができません。Forms.TextBox を試してみると、マウスホイールも機能しています。「ネイティブ」フォーム アプリでグラフを使用すると、マウス ホイールも機能します。

したがって、問題を引き起こしているのは、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 からすべてのクリックとマウス ホイールを受け取ることができますが、フォームからホイールを受け取ることはできません。formsHost の wheel リスナーも試してみましたが、成功しませんでした。

何か案は?ジョン・スキート?

4

1 に答える 1

1

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

WinForms 自体は Win32 の世界からのメッセージ処理のマップであるため、WPF に WindowsForms コントロールを埋め込む場合は手動でコーディングする必要があります。マウス クリック以外のマウス イベント (マウス ホイールを含む) を処理するには、winforms イベントを代理する必要があります。

.NET 4 の MSDN ライブラリは、これを明確に述べています。

サロゲート Windows フォーム メッセージ ループ

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

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

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

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

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

ウィンドウ ハンドルが破棄されると、WindowsFormsHost コントロールは自身を登録から削除します。

詳細については、http: //msdn.microsoft.com/en-us/library/ms742474.aspxをご覧ください。

于 2011-09-14T10:47:34.153 に答える