2010-03-10 12 views
12

Sto provando a sollevare un oggetto MouseLeftButtonDownEvent facendo esplodere l'albero visivo con il seguente codice.Raising WPF MouseLeftButtonDownEvent event

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

Per qualche motivo, i componenti di livello superiore non ricevono questo evento bollente. Sto trascurando qualcosa o non è possibile sollevare questo evento del mouse

risposta

20

Il tuo problema è che stai sollevando un evento che non bolle.

MouseLeftButtonDownEvent è definito come RoutingStrategy.Direct, il che significa che viene instradato solo al controllo che riceve l'evento.

Si desidera invece utilizzare l'evento Mouse.MouseDownEvent. UIElement e altre classi convertite internamente in un MouseLeftButtonDownEvent. Assicurarsi di impostare e.ChangedButton a MouseButton.Left:

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

potrei sbagliarmi a mio parere - ma almeno ho guardato un po 'di tempo fa per un po' la lunghezza in InputManager.

Il mio curriculum è: il bubbling e il tunneling sono eseguiti da InputManager. Tuttavia chiamando lo uielement.Raise() consegnerà sempre l'evento direttamente (indipendentemente dallo RoutingStrategy come Ray Burns mentioed).

Ma (indovinare) a seconda del RoutingStrategyInputManager va su e giù l'albero visiva tra CompositionRoot e VisualTreeHlper.Hittest()- Ed visiva e fornisce tunneling ed eventi bublling.

C'è un modo per raccogliere eventi tramite l'InputManager, ma non è ufficiale e ha bisogno di riflessione (ce l'ho da un altro 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); 
    }