События мыши не принимаются WPF ScrollViewer при размещении в контейнере WinForms - PullRequest
6 голосов
/ 20 апреля 2011

У нас есть приложение WinForms, которое мы постепенно преобразовываем в WPF. На этом этапе основной формой приложения является форма (WinForms), которая содержит вертикальную боковую панель, встроенную в WPF. Боковая панель находится в элементе управления ElementHost.

Боковая панель состоит из ScrollViewer, который содержит другие элементы управления. Проблема в том, что когда фокус находится где-то в аэре WinForms, и я использую колесо мыши над ScrollViewer, оно не прокручивается.

Это связано с интеграцией WPF / WinForms, поскольку в проекте 100% WPF ScrollViewer реагирует на колесо мыши, даже если фокус находится на другом элементе управления.

Как правильно это исправить?

Ответы [ 2 ]

4 голосов
/ 04 мая 2011

рассмотрите возможность создания фильтра сообщений, и когда вы получите 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;
   }
}
1 голос
/ 19 октября 2011

Попробуйте установить фокус на ElementHost, вызвав elementHost.Select() Это заставило событие MouseWheel работать на меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...