2014-11-13 5 views
1

У меня есть контроль Winforms в WPF WindowsFormsHost. Элемент управления Winforms является пассивным и не должен обрабатывать событие мыши. События мыши должны быть подняты, как обычно, из самого внутреннего элемента управления WPF в визуальном дереве WPF, поэтому WindowsFormsHost (или следующий). Но никакое событие не срабатывает вообще.Держите мышь в пузырьках от WindowsFormsHost на

Как мне настроить WindowsFormsHost, элемент управления Winforms, чтобы достичь этого?

Примечание: KeyDown и KeyUp ведут себя так, как ожидалось. Но события мыши не делают, как показано на следующем скриншоте Snoop:

enter image description here

+0

Winforms делает немного, чтобы изменить способ, генерирующий для Windows и перенаправляет уведомления за пределами обработки сочетание клавиш и отражает некоторые сообщения от родителя к ребенку. MouseWheel пузырьки для родителя, а остальные нет. WindowsFormsHost не делает ничего, чтобы изменить это. Так что это вполне ожидаемо. Если элемент управления не должен принимать входные события, тогда его свойство Enabled должно иметь значение false. Вам, вероятно, это не нравится :) –

+0

Спасибо! Пожалуйста, объясните ... если вы замените WindowsFormsHost простым WPF UserControl, тогда работа пузырьков и событие MouseDown начнут пузыриться и поднимать хакеры подписчиков на пути вверх. Кажется, что Winforms Control сохраняет событие мыши для себя и не передает событие своему хосту. Это верно? – jeromerg

ответ

4

Действительно Winforms управления сохраняет событие мыши для себя и не пересылает событие к своему хозяину. Решение состоит в том, чтобы подписаться на событие winforms MouseDown и программно генерировать Маршрутизированное событие.

Я перекрытая в WindowsFormsHost следующим образом и это качается:

(замечание: поведение может быть более гибким)

public class ExtendedWindowsFormsHost : WindowsFormsHost 
{ 
    public ExtendedWindowsFormsHost() 
    { 
     ChildChanged += OnChildChanged; 
    } 

    private void OnChildChanged(object sender, ChildChangedEventArgs childChangedEventArgs) 
    { 
     var previousChild = childChangedEventArgs.PreviousChild as Control;    
     if (previousChild != null) 
     { 
      previousChild.MouseDown -= OnMouseDown; 
     } 
     if (Child != null) 
     { 
      Child.MouseDown += OnMouseDown; 
     } 
    } 

    private void OnMouseDown(object sender, MouseEventArgs mouseEventArgs) 
    { 
     MouseButton? wpfButton = ConvertToWpf(mouseEventArgs.Button); 
     if (!wpfButton.HasValue) 
      return; 

     RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, wpfButton.Value) 
     { 
      RoutedEvent = Mouse.MouseDownEvent, 
      Source = this, 
     }); 
    } 

    private MouseButton? ConvertToWpf(MouseButtons winformButton) 
    { 
     switch (winformButton) 
     { 
      case MouseButtons.Left: 
       return MouseButton.Left; 
      case MouseButtons.None: 
       return null; 
      case MouseButtons.Right: 
       return MouseButton.Right; 
      case MouseButtons.Middle: 
       return MouseButton.Middle; 
      case MouseButtons.XButton1: 
       return MouseButton.XButton1; 
      case MouseButtons.XButton2: 
       return MouseButton.XButton2; 
      default: 
       throw new ArgumentOutOfRangeException("winformButton"); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^