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.