C# 在WPF中按住鼠标事件

C# 在WPF中按住鼠标事件,c#,wpf,mouseevent,C#,Wpf,Mouseevent,我正在尝试使用PreviewMouseDown和Dispatchermer按下鼠标事件,如下所示: private void button_PreviewMouseDown(object sender, MouseButtonEventArgs e) { dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); dispatcherTimer.Interval = new TimeSp

我正在尝试使用PreviewMouseDownDispatchermer按下鼠标事件,如下所示:

 private void button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
        dispatcherTimer.Start();
    }

 private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        _sec = _sec + 1;
        if (_sec == 3)
        {
            dispatcherTimer.Stop();
            MessageBox.Show(_sec.ToString());
            _sec = 0;
            return;
        }
    }

此代码正常工作,但第一次按下鼠标需要3秒来显示消息,之后显示消息的时间会缩短(少于3秒)

第二次调用此代码时

dispatcherTimer.Tick += dispatcherTimer_Tick; // try without that new EventHandler(...)
将附加第二个手柄。因此,在第一秒钟之后,sec将是2,因为事件被调用了两次

您可以尝试在PreviewMouseUp上释放DispatcherItemer变量并将其设置为null,并在PreviewMouseDown上创建一个新实例

或者另一个选项是,在PreviewMouseUp上,您可以

dispatcherTimer.Tick -= dispatcherTimer_Tick;
sec = 0;

-=将分离事件处理程序。

第二次调用时

dispatcherTimer.Tick += dispatcherTimer_Tick; // try without that new EventHandler(...)
将附加第二个手柄。因此,在第一秒钟之后,sec将是2,因为事件被调用了两次

您可以尝试在PreviewMouseUp上释放DispatcherItemer变量并将其设置为null,并在PreviewMouseDown上创建一个新实例

或者另一个选项是,在PreviewMouseUp上,您可以

dispatcherTimer.Tick -= dispatcherTimer_Tick;
sec = 0;

-=将分离事件处理程序。

执行此操作不需要Dispatcher。您可以处理PreviewMouseDown和PreviewMouseUp事件

请参考以下示例代码

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        PreviewMouseDown += Window3_PreviewMouseDown;
        PreviewMouseUp += Window3_PreviewMouseUp;
    }

    DateTime mouseDown;
    private void Window3_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        mouseDown = DateTime.Now;
    }

    readonly TimeSpan interval = TimeSpan.FromSeconds(3);
    private void Window3_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (DateTime.Now.Subtract(mouseDown) > interval)
            MessageBox.Show("Mouse was held down for > 3 seconds!");
        mouseDown = DateTime.Now;
    }
}

你不需要一个调度员来做这件事。您可以处理PreviewMouseDown和PreviewMouseUp事件

请参考以下示例代码

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        PreviewMouseDown += Window3_PreviewMouseDown;
        PreviewMouseUp += Window3_PreviewMouseUp;
    }

    DateTime mouseDown;
    private void Window3_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        mouseDown = DateTime.Now;
    }

    readonly TimeSpan interval = TimeSpan.FromSeconds(3);
    private void Window3_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (DateTime.Now.Subtract(mouseDown) > interval)
            MessageBox.Show("Mouse was held down for > 3 seconds!");
        mouseDown = DateTime.Now;
    }
}

我试过了,但在第一次发信息后根本不起作用!你能展示一下你试过的吗?如果您重新连接事件处理程序,它应该可以工作。我尝试过,但在第一条消息之后它根本不工作!你能展示一下你试过的吗?如果您重新连接事件处理程序,它应该可以工作。感谢您的帮助,我需要Dispatcher通知用户一些内容,请参阅下面的我的answe。感谢您的帮助,我需要Dispatcher通知用户一些内容,请参阅下面的我的answe。