내 의견으로는 잘못 될 수도 있습니다 -하지만 적어도 나는 InputManager
에 꽤 길이 얼마 전에 보았다 : 당신이 MouseButton.Left
에 e.ChangedButton을 설정해야합니다.
내 이력서는 다음과 같습니다. 버블 링 및 터널링은 InputManager
입니다. 그러나 uielement.Raise()
을 호출하면 이벤트가 직접 전달됩니다 (Ray Burns가 언급 한대로 RoutingStrategy
에 관계없이).
그러나 RoutingStrategy
InputManager
에 따라 (추측하는 것은) 위로 CompositionRoot
사이의 시각적 트리 아래로 이동하고 VisualTreeHlper.Hittest()-
비주얼 에드와 터널링 및 bublling 이벤트를 제공합니다.
은 InputManager를 통해 이벤트를 발생시킬 수있는 방법이있다, 그러나 공식 아니며 (나는 다른 유래 포스트에서이) 반사를 필요 :
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);
}