8

我正在尝试以编程方式在 WPF 控件上手动触发 MouseLeftButtonDown 事件,因为我使用的是 Microsoft Surface SDK,它不会触发 MouseLeftButtonDown 事件,而是触发 ContactDown 事件。基本上,我试图将 MouseLeftButtonDown 事件向下推送到控件,以触发控件上的正确行为,同时处理 ContactDown 事件。

我猜我必须以某种方式使用控件上的 RaiseEvent 方法来使用 MouseButtonEventArgs 执行此操作,但我在确定参数时遇到了一些麻烦。

在此先感谢您的帮助!

4

4 回答 4

6

您可以使用 Win32 互操作来欺骗鼠标和键事件。研究MSDN / pinvoke.net上的 SendInput 函数。

请注意,这将导致系统和其他应用程序认为鼠标实际被单击。如果您只想启动 WPF 事件,请尝试RaiseEvent( new RoutedEventArgs( UIElement.MouseLeftButtonDownEvent ) ).

于 2010-06-13T21:58:20.017 回答
5

希望在控件中触发特定事件通常是代码中设计问题的指标。事件处理程序应该触发行为,而不是执行它。我建议您将执行由MouseLeftButtonDown事件处理程序触发的操作的代码移动到单独的方法中。然后可以从ContactDown事件处理程序调用相同的方法。

于 2010-06-13T20:49:21.483 回答
4
var grid = new Grid();            

int timestamp = new TimeSpan(DateTime.Now.Ticks).Milliseconds;
const MouseButton mouseButton = MouseButton.Left;
var mouseDownEvent =
   new MouseButtonEventArgs(Mouse.PrimaryDevice, timestamp, mouseButton) {
       RoutedEvent = UIElement.MouseLeftButtonDownEvent,
       Source = grid,
   };

这就是我在测试代码中触发事件的方式。

于 2011-12-15T15:00:22.137 回答
1

这是我用来为 any 引发点击事件的静态方法UIElement

using System;
using System.Windows;
using System.Windows.Input;

    
public static void RaiseMouseClickEvent(UIElement elementToClick, MouseButton buttonToUse)
{
    elementToClick.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, buttonToUse) { RoutedEvent = Button.ClickEvent });
}
于 2020-11-27T08:02:50.890 回答