WPF DispatcherTimer和鼠标按钮单击时间

时间:2009-06-04 02:38:39

标签: c# .net wpf

考虑以下代码,我有一个文本块,它是WPF中的“开/关”按钮。它只是一个椭圆内的文字,表示ON / OFF。当用户单击按钮并按住鼠标一秒钟时,如果设备尚未通电,它将执行“打开设备”代码。如果用户按住ON / OFF按钮三秒钟或更长时间(按住鼠标左键),设备将关闭。

我错过了几个问题。 1.尽管计时器已启动,但在按住鼠标按钮时不会触发tick事件。 2.尽管按下按钮

,do / while循环仍然不会退出

谢谢!

    public int TimerCount = 0;

    private void ButtonPressTimer(object sender, EventArgs e)
    {
        TimerCount = TimerCount + 1;
    }

    private void txtBlockOnOff_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var buttonPressTimer = new DispatcherTimer(new TimeSpan(0, 0, 0, 1), DispatcherPriority.Normal, ButtonPressTimer, this.Dispatcher);

        do
        {
            if (!buttonPressTimer.IsEnabled)
                buttonPressTimer.Start();
        }
        while (e.ButtonState == MouseButtonState.Pressed);

        buttonPressTimer.Stop();
        if (TimerCount >= 3)
        {
            //do something here
        }
        else
        { 
            //do something different here
        }
    }

3 个答案:

答案 0 :(得分:5)

我会看一个稍微不同的方法,不需要设置计时器的开销。如果您同时处理鼠标按下和向上事件,并存储按下按钮的时间,您可以将其与释放鼠标的时间进行比较,并决定要做什么。

private DateTime mousePressed;

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

private void txtBlockOnOff_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    // button released

    TimeSpan difference = DateTime.Now - mousePressed;

    if (difference.TotalSeconds >= 3)
    {
        // long press
    }
    else
    {
        // short press
    }
}

答案 1 :(得分:3)

我相信这个问题的答案是使用RepeatButton,它完全符合你的要求,即它继续激活事件,直到你按下按钮。

答案 2 :(得分:1)

你陷入了循环 - Dispatcher Timers在同一个线程上触发,但是你忙着陷入Clicked处理程序。

编辑:想一想 - 怎么会有人改变MousePressed标志?只有一个线程(技术上很好,两个,但记住它是一个!)如果你阻止处理程序,WPF不能任何