14

我正在尝试通过使用以下代码在 Visual 树中冒泡来引发 MouseLeftButtonDownEvent。

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

由于某种原因,更高级别的组件没有收到此冒泡事件。我是否忽略了某些东西,或者无法引发此鼠标事件

4

2 回答 2

26

您的问题是您正在引发一个不会冒泡的事件。

MouseLeftButtonDownEvent定义为RoutingStrategy.Direct,这意味着它只路由到接收事件的控件。

您想改用Mouse.MouseDownEvent事件。 UIElement和其他类在内部将其转换为MouseLeftButtonDownEvent. 确保将 e.ChangedButton 设置为MouseButton.Left

RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)
{
  RoutedEvent = Mouse.MouseDownEvent,
  Source = this,
});
于 2010-03-11T00:46:06.413 回答
0

在我看来我可能是错的——但至少我前段时间看了很长时间InputManager

我的简历是:冒泡和隧道是由InputManager. 然而,调用uielement.Raise()只会直接传递事件(不管RoutingStrategyRay Burns 是否提到过)。

但是(猜测)取决于和ed Visual 之间的视觉树RoutingStrategyInputManager上升和下降,并提供隧道和冒泡事件。CompositionRootVisualTreeHlper.Hittest()-

有一种通过 InputManager 引发事件的方法,但它不是官方的,需要反思(我从另一个 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);
    }
于 2015-10-16T07:02:31.490 回答