Вопрос по .net, timer, c#, events, wpf – Таймер для запуска события WPF

3

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

Меня попросили зажечь событие только через 3 секунды. Это означает, что пользователь поместит мышь на элемент управления, и только через 3 секунды должно произойти событие для всех элементов управления в окне.

Итак, я подумал о глобальном таймере или о чем-то подобном, который будет возвращать false, пока таймер не достигнет 3 ... Я думаю, что так ...

Боже, кто-нибудь знает, как я могу сделать такую вещь?

Спасибо!!

Можете ли вы просто спать 3 секунды в событии MouseEnter? paparazzo
Спящий в течение 3 секунд в событии MouseEnter заблокирует пользовательский интерфейс на 3 секунды. Wonko the Sane

Ваш Ответ

2   ответа
1

Я просто хотел добавить более простое решение:

public static void DelayedExecute(Action action, int delay = 3000)
{
    Task.Factory.StartNew(() => 
    {
        Thread.Sleep(delay);
        action();
    }
}

Тогда используйте это так же, как вэтот другой ответ

В этой статье указывается несколько причин:msmvps.com/blogs/peterritchie/archive/2007/04/26/…
Это действительно проще, но я думаюSleep следует избегать, когда это возможно.
@AdiLester не могли бы вы прокомментировать, почему?
7

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

public static class DelayedExecutionService
{
    // We keep a static list of timers because if we only declare the timers
    // in the scope of the method, they might be garbage collected prematurely.
    private static IList<DispatcherTimer> timers = new List<DispatcherTimer>();

    public static void DelayedExecute(Action action, int delay = 3)
    {
        var dispatcherTimer = new System.Windows.Threading.DispatcherTimer();

        // Add the timer to the list to avoid it being garbage collected
        // after we exit the scope of the method.
        timers.Add(dispatcherTimer);

        EventHandler handler = null;
        handler = (sender, e) =>
        {
            // Stop the timer so it won't keep executing every X seconds
            // and also avoid keeping the handler in memory.
            dispatcherTimer.Tick -= handler;
            dispatcherTimer.Stop();

            // The timer is no longer used and shouldn't be kept in memory.
            timers.Remove(dispatcherTimer);

            // Perform the action.
            action();
        };

        dispatcherTimer.Tick += handler;
        dispatcherTimer.Interval = TimeSpan.FromSeconds(delay);
        dispatcherTimer.Start();
    }
}

Тогда вы можете назвать это так:

DelayedExecutionService.DelayedExecute(() => MessageBox.Show("Hello!"));

или же

DelayedExecutionService.DelayedExecute(() => 
{
    DoSomething();
    DoSomethingElse();
});
@ ArmandoFreire Рад слышать. Обратите внимание, что я изменил код, чтобы избежать возможной утечки памяти.
Конечно @AdiLester, я тоже обновил свой! Код сэкономил здесь кучу времени !! Большое спасибо! Armando Freire
Эй, @Ади, как мне добавить более одного метода для этого события? Я имею в виду, что я пытаюсь запустить два метода (например, вызвать два окна сообщения), но это не работает. Должен ли я вызвать эту функцию дважды? Armando Freire
@ArmandoFreire Передаваемый вами делегат может выполнять несколько операторов. Я обновил свой ответ, чтобы продемонстрировать это.
Вот Это Да! Отличное решение, сэр! Работало отлично !! Я просто собираюсь подумать о визуальной обратной связи, например, о растущем круге вокруг курсора или о чем-то похожем! Большое спасибо! Armando Freire

Похожие вопросы