Minuterie WPF comme minuterie C #


177

Où puis-je trouver un contrôle qui ressemble au contrôle de minuterie C # dans WPF?

Réponses:


325

Le minuteur WPF habituel est le DispatcherTimer, qui n'est pas un contrôle mais utilisé dans le code. Cela fonctionne fondamentalement de la même manière que le minuteur 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
}

Pour en savoir plus sur DispatcherTimer, cliquez ici


Salut, j'ai essayé d'utiliser la minuterie d'expédition mais je ne peux pas la trouver dans mon intelisense. Y a-t-il une référence qui doit être ajoutée pour que je puisse l'utiliser?
yohannes

2
J'aime la façon dont vous définissez l'intervalle, mieux que les millisecondes à mon avis.
JL.

Assurez-vous d'appeler dispatcherTimer.Stop () lorsque vous fermez votre formulaire. La version WinForms du minuteur le fait automatiquement. (C'est l'avantage de faire de la minuterie un contrôle.) Sinon, vous aurez une fuite de mémoire et éventuellement d'autres bogues.
Trade-Ideas Philip

7
@JL Eh? Ce code est impossible à interpréter. Bien mieux estvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Avec Dispatcher, vous devrez inclure

using System.Windows.Threading;

Notez également que si vous cliquez avec le bouton droit sur DispatcherTimer et cliquez sur Résoudre, il doit ajouter les références appropriées.


besoin d'ajouter une référence à WindowsBase.dll btw
George Birbilis

16
À mon humble avis, cela ne répond pas à la question sur le contrôle à utiliser, il ajoute simplement quelques commentaires à la réponse acceptée.
Stephen Kennedy

3
J'ai ajouté cela en 2012, en commençant vraiment en tant que développeur, j'obtiens toujours des points pour cela. Mais comme l'a souligné @StephenKennedy, cela devrait être un commentaire.
Malcor


0

La minuterie a des fonctions spéciales.

  1. Appelez une minuterie asynchrone ou une minuterie synchrone.
  2. Changer l'intervalle de temps
  3. Possibilité d'annuler et de reprendre  

si vous utilisez StartAsync ()ou Start (), le thread ne bloque pas l'élément d'interface utilisateur

     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;
        }
    }


     }

Pouvez-vous expliquer votre code? Si vous publiez simplement du code, les gens n'en apprendront pas et copient et collez simplement du code à partir du Web.
Robert
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.