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 が言及したものに関係なく)。

しかし (推測) によって、RoutingStrategyとed VisualInputManagerの間のビジュアル ツリーが上下に移動し、トンネリング イベントとバブリング イベントが配信されます。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 に答える