2010-03-10 12 views
12

Estoy intentando levantar un MouseLeftButtonDownEvent burbujeando el árbol visual con el siguiente código.Raising WPF MouseLeftButtonDownEvent evento

  MouseButtonEventArgs args = new MouseButtonEventArgs(Mouse.PrimaryDevice,0,  MouseButton.Left);    
     args.RoutedEvent = UIElement.MouseLeftButtonDownEvent; 
     args.Source = this; 
     RaiseEvent(args); 

Por alguna razón, los componentes de nivel superior no reciben este evento burbujeante. Estoy pasando por alto algo o no es posible plantear este evento de mouse

Respuesta

20

Su problema es que está provocando un evento que no provoca burbujas.

MouseLeftButtonDownEvent se define como RoutingStrategy.Direct, lo que significa que se enruta solo al control que recibe el evento.

En su lugar, desea utilizar el evento Mouse.MouseDownEvent. UIElement y otras clases internamente convierten esto en MouseLeftButtonDownEvent. Asegúrese de que establece e.ChangedButton a MouseButton.Left:

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

puedo estar equivocado en mi opinión - pero al menos lo era hace algún tiempo desde hace bastante longitud en InputManager.

Mi currículum vitae de eso es: El burbujeo y el efecto túnel se realiza por InputManager. Sin embargo, al llamar al uielement.Raise(), solo se enviará el evento directamente (independientemente de RoutingStrategy como se mencione Ray Burns).

Pero (adivinanzas) dependiendo de la RoutingStrategyInputManager sube y baja el árbol visual entre CompositionRoot y la VisualTreeHlper.Hittest()- ed visual y entrega de túneles y eventos bublling.

Hay una manera de provocar eventos a través de la InputManager, pero no es oficial y necesita reflexión (lo sé por otro post Stackoverflow):

void RaiseMouseInputReportEvent(Visual eventSource, int timestamp, int pointX, int pointY, int wheel) 
    { 
     Assembly targetAssembly = Assembly.GetAssembly(typeof(InputEventArgs)); 
     Type mouseInputReportType = targetAssembly.GetType("System.Windows.Input.RawMouseInputReport"); 

     Object mouseInputReport = mouseInputReportType.GetConstructors()[0].Invoke(new Object[] { 
     InputMode.Foreground, timestamp, PresentationSource.FromVisual(eventSource), 
     RawMouseActions.AbsoluteMove | RawMouseActions.Activate, 
     pointX, pointY, wheel, IntPtr.Zero }); 

     mouseInputReportType.GetField("_isSynchronize", BindingFlags.NonPublic | BindingFlags.Instance) 
      .SetValue(mouseInputReport, true); 

     InputEventArgs inputReportEventArgs = (InputEventArgs)targetAssembly 
      .GetType("System.Windows.Input.InputReportEventArgs") 
      .GetConstructors()[0] 
      .Invoke(new Object[] { 
      Mouse.PrimaryDevice, 
      mouseInputReport }); 

     inputReportEventArgs.RoutedEvent = (RoutedEvent)typeof(InputManager) 
      .GetField("PreviewInputReportEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) 
      .GetValue(null); 

     bool handled = InputManager.Current.ProcessInput((InputEventArgs)inputReportEventArgs); 
    } 
Cuestiones relacionadas