Zegar WPF, taki jak zegar C #

177

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

cetyna
źródło

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

Gimno
źródło
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.

Malcor
źródło
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
3

możesz także użyć

using System.Timers;
using System.Threading;
Pavan R Bhupalam
źródło
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;
        }
    }


     }
Pan Ds262 Pro
źródło
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