在WPF中按住鼠标事件

时间:2017-01-17 18:26:23

标签: c# wpf mouseevent

我尝试使用 PreviewMouseDown DispatcherTimer 按住鼠标事件,如下所示:

 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秒)

2 个答案:

答案 0 :(得分:2)

您不需要DispatcherTimer来执行此操作。您可以处理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;
    }
}

答案 1 :(得分:1)

第二次调用

dispatcherTimer.Tick += dispatcherTimer_Tick; // try without that new EventHandler(...)

将附上第二个处理。因此,在第一秒之后,sec将为2,因为事件被调用两次。

您可以尝试将PreviewMouseUp&上的dispatcherTimer变量置于句点并设置为null。在PreviewMouseDown上创建一个新实例。

或者另一种选择是,在PreviewMouseUp上,你可以

dispatcherTimer.Tick -= dispatcherTimer_Tick;
sec = 0;

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