WPF DispatcherTimer и время нажатия кнопки мыши - PullRequest
3 голосов
/ 04 июня 2009

Рассмотрим следующий код, у меня есть текстовый блок, который является кнопкой «вкл / выкл» в WPF. Это просто текст внутри эллипса, который говорит ON / OFF. Когда пользователь нажимает кнопку и удерживает левую кнопку мыши в течение ОДНОЙ секунды, он выполняет код включения устройства, если устройство еще не включено. Если пользователь удерживает кнопку ON / OFF в течение трех или более секунд (удерживая левую кнопку мыши нажатой), устройство выключится.

Несколько проблем, по которым я скучаю по лодке. 1. Событие галочки не срабатывает, пока нажата кнопка мыши, несмотря на то, что таймер запущен. 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 ]

5 голосов
/ 04 июня 2009

Я бы посмотрел на немного другой подход, который не требует дополнительных затрат на настройку таймера. Если вы обрабатываете события мыши как вверх и вниз, так и сохраняете время нажатия кнопки, вы можете сравнить его со временем отпускания мыши и решить, что делать.

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
    }
}
3 голосов
/ 02 февраля 2011

Я полагаю, что ответом на этот вопрос является использование кнопки RepeatButton, которая делает именно то, что вам нужно, т.е. она продолжает вызывать событие, пока вы не отпустите кнопку.

1 голос
/ 04 июня 2009

Вы застряли в цикле - таймеры диспетчера запускаются в том же потоке, но вы заняты, застряв в обработчике Clicked.

Изменить: Подумайте об этом - как кто-нибудь собирается изменить флаг MousePressed? Существует только один поток (ну, технически, два, но запомните это как один!) Если вы заблокируете в обработчике, WPF не сможет сделать что-либо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...