Таймер WPF як таймер C #


177

Де я можу знайти елемент керування, подібний до керування таймером C # у WPF?

Відповіді:


325

Звичайний таймер WPF - це той DispatcherTimer, який не є контролем, але використовується в коді. Це в основному працює так само, як таймер WinForms:

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();


private void dispatcherTimer_Tick(object sender, EventArgs e)
{
  // code goes here
}

Більше про DispatcherTimer можна прочитати тут


Привіт, я намагався використовувати таймер диспетчеризації, але я не можу знайти його в моїй інтелігентності? Чи є якась посилання, яку потрібно додати для мене, щоб використовувати його?
yohannes

2
Мені подобається те, як ти задаєш інтервал, кращий за мілісекунди на мій погляд.
JL.

Обов’язково зателефонуйте на диспетчерTimer.Stop (), коли закриєте форму. Версія таймера WinForms робить це автоматично. (Це перевага зробити таймер контролем.) Якщо у вас немає, у вас не буде витоку пам'яті та, можливо, інших помилок.
Trade-Ideas Philip

7
@JL Е? Цей код неможливо інтерпретувати. Набагато кращеvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Джим Балтер

12

З диспетчером вам потрібно буде включити

using System.Windows.Threading;

Також зауважте, що якщо ви клацніть правою кнопкою миші DispatcherTimer і натисніть кнопку Розв'язати, слід додати відповідні посилання.


потрібно додати посилання на WindowsBase.dll btw
Джордж Бірбіліс

16
IMHO це не відповідає на питання, який контроль використовувати, він лише додає коментар до прийнятої відповіді.
Стівен Кеннеді

3
Я додав це в 2012 році, тільки починаючи розробником, я все одно отримую за це бали. Але як зазначав @StephenKennedy, це має бути коментарем.
Малькор


0

Таймер має спеціальні функції.

  1. Виклик асинхронного таймера або синхронного таймера.
  2. Змініть інтервал часу
  3. Можливість скасування та відновлення  

якщо ви використовуєте StartAsync ()або Start (), потік не блокує елемент інтерфейсу користувача

     namespace UITimer


     {
        using thread = System.Threading;
        public class Timer
        {

        public event Action<thread::SynchronizationContext> TaskAsyncTick;
        public event Action Tick;
        public event Action AsyncTick;
        public int Interval { get; set; } = 1;
        private bool canceled = false;
        private bool canceling = false;
        public async void Start()
        {
            while(true)
            {

                if (!canceled)
                {
                    if (!canceling)
                    {
                        await Task.Delay(Interval);
                        Tick.Invoke();
                    }
                }
                else
                {
                    canceled = false;
                    break;
                }
            }


        }
        public void Resume()
        {
            canceling = false;
        }
        public void Cancel()
        {
            canceling = true;
        }
        public async void StartAsyncTask(thread::SynchronizationContext 
        context)
        {

                while (true)
                {
                    if (!canceled)
                    {
                    if (!canceling)
                    {
                        await Task.Delay(Interval).ConfigureAwait(false);

                        TaskAsyncTick.Invoke(context);
                    }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }

        }
        public void StartAsync()
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while (true)
                {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);

                    Application.Current.Dispatcher.Invoke(AsyncTick);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }

        public void StartAsync(thread::SynchronizationContext context)
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while(true)
                 {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);
                            context.Post((xfail) => { AsyncTick.Invoke(); }, null);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }
        public void Abort()
        {
            canceled = true;
        }
    }


     }

Чи можете ви пояснити свій код? Якщо ви просто опублікуєте якийсь код, люди з нього не навчаться, а просто копіюють і вставляють якийсь код з Інтернету.
Роберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.