Таймер 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 можно узнать здесь


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

2
Мне нравится, как вы устанавливаете интервал, на мой взгляд, лучше, чем миллисекунды.
JL.

Обязательно вызовите dispatcherTimer.Stop () при закрытии формы. Версия таймера WinForms делает это автоматически. (Это преимущество в том, что таймер становится элементом управления.) Если у вас нет утечки памяти и, возможно, других ошибок.
Trade-Ideas Philip

7
@JL А? Этот код невозможно интерпретировать. Намного лучшеvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Джим Балтер

12

С Dispatcher вам нужно будет включить

using System.Windows.Threading;

Также обратите внимание, что если вы щелкнете правой кнопкой мыши по DispatcherTimer и нажмете Resolve, он должен добавить соответствующие ссылки.


нужно добавить ссылку на WindowsBase.dll кстати
Джордж Бирбилис

16
ИМХО, это не отвечает на вопрос о том, какой элемент управления использовать, а просто добавляет комментарий к принятому ответу.
Стивен Кеннеди

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.