6

段階的に WPF に変換している WinForms アプリケーションがあります。この時点で、アプリケーションのメイン フォームは、WPF に組み込まれた垂直サイドバーを含むフォーム (WinForms) です。サイドバーは ElementHost コントロールでホストされます。

サイドバーは、他のコントロールを含む ScrollViewer で構成されています。問題は、フォーカスが WinForms aera のどこかにあり、ScrollViewer でマウス ホイールを使用すると、スクロールしないことです。

これは、WPF/WinForms の統合に関連しています。これは、100% WPF プロジェクトでは、フォーカスが別のコントロールにある場合でも、ScrollViewer がマウス ホイールに反応するためです。

これを修正する正しい方法は何ですか?

4

2 に答える 2

4

メッセージ フィルターを実行することを検討し、WM_MOUSEWHEEL を受け取ったら、マウスが WPF コントロール上にあるかどうかを判断します。その場合は、メッセージをエレメント ウィンドウ ハンドルに直接送信します。

このようなもの:

System.Windows.Forms.Application.AddMessageFilter( new MouseWheelMessageFilter( YourElementInsideAnElementHost ) );

スコープ外に出るときは、RemoveMessageFilter を呼び出すことを忘れないでください

public class MouseWheelMessageFilter : IMessageFilter
{
   private const int WM_MOUSEWHEEL = 0x020A;
   private FrameworkElement _element;

   [DllImport("user32.dll")]
   public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

   public MouseWheelMessageFilter(FrameworkElement element)
   {
       _element = element;
   }

   public bool PreFilterMessage(ref Message m)
   {
       if (m.Msg == WM_MOUSEWHEEL)
       {
           Rect rect = new Rect(0, 0, _element.ActualWidth, _element.ActualHeight);
           Point pt = Mouse.GetPosition(_element);

           if (rect.Contains(pt))
           {
               HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(_element);
               SendMessage(hwndSource.Handle, m.Msg, m.WParam, m.LParam);
               return true;
           }
       }

       return false;
   }
}
于 2011-05-04T19:08:47.633 に答える
1

これを呼び出して、ElementHost にフォーカスを設定してみてくださいelementHost.Select() 。これにより、MouseWheel イベントが機能しました。

于 2011-10-19T08:04:52.780 に答える