Zegar WPF, taki jak zegar C #


177

Gdzie mogę znaleźć formant, który jest podobny do kontrolki czasomierza C # w WPF?

Odpowiedzi:


325

Zwykły licznik czasu WPF to DispatcherTimer, który nie jest formantem, ale jest używany w kodzie. Zasadniczo działa tak samo jak licznik czasu 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
}

Więcej na temat DispatcherTimer można znaleźć tutaj


Cześć, próbuję użyć licznika czasu wysyłki, ale nie mogę go znaleźć w moim Intelisense. Czy muszę dodać jakieś odniesienie, aby z niego korzystać?
yohannes

2
Podoba mi się sposób, w jaki ustawiasz interwał, moim zdaniem lepszy niż milisekundy.
JL.

Pamiętaj, aby wywołać metodę dispatcherTimer.Stop () po zamknięciu formularza. Wersja czasomierza WinForms robi to automatycznie. (To zaleta uczynienia timera kontrolnym). Jeśli tego nie zrobisz, będziesz mieć wyciek pamięci i prawdopodobnie inne błędy.
Trade-Ideas Philip

7
@JL Eh? Tego kodu nie da się zinterpretować. O wiele lepiejvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

W przypadku Dispatchera musisz dołączyć

using System.Windows.Threading;

Zauważ również, że jeśli klikniesz prawym przyciskiem myszy DispatcherTimer i klikniesz Rozwiąż, powinno dodać odpowiednie odniesienia.


trzeba dodać odniesienie do WindowsBase.dll btw
George Birbilis,

16
IMHO to nie odpowiada na pytanie, której kontrolki użyć, a jedynie dodaje komentarz do zaakceptowanej odpowiedzi.
Stephen Kennedy

3
Dodałem to w 2012 roku, dopiero zaczynając jako programista, wciąż dostaję za to punkty. Ale jak zauważył @StephenKennedy, powinien to być komentarz.
Malcor


0

Timer ma specjalne funkcje.

  1. Wywołaj zegar asynchroniczny lub zegar synchroniczny.
  2. Zmień przedział czasu
  3. Możliwość anulowania i wznowienia  

jeśli używasz StartAsync ()lub Start (), wątek nie blokuje elementu interfejsu użytkownika

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


     }

Czy możesz wyjaśnić swój kod? Jeśli po prostu prześlesz jakiś kod, ludzie nie nauczą się z niego i po prostu skopiuj i wklej kod z sieci.
Robert
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.