Hẹn giờ WPF Giống như Hẹn giờ C #


177

Tôi có thể tìm một điều khiển giống như Điều khiển hẹn giờ C # trong WPF ở đâu?

Câu trả lời:


325

Bộ định thời WPF thông thường là DispatcherTimer, không phải là điều khiển mà được sử dụng trong mã. Về cơ bản, nó hoạt động giống như bộ đếm thời gian 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
}

Thông tin thêm về DispatcherTimer có thể được tìm thấy ở đây


Xin chào, tôi đã cố gắng sử dụng bộ đếm thời gian gửi nhưng tôi không thể tìm thấy nó trong intelisense của tôi có bất kỳ tài liệu tham khảo nào cần được thêm vào để tôi sử dụng nó không?
yohannes

2
Tôi thích cách bạn đặt khoảng thời gian, tốt hơn so với mili giây theo ý kiến ​​của tôi.
JL.

Hãy chắc chắn gọi disatcherTimer.Stop () khi bạn đóng biểu mẫu của mình. Phiên bản WinForms của bộ đếm thời gian thực hiện điều đó tự động. (Đó là lợi thế của việc biến bộ hẹn giờ thành Kiểm soát.) Nếu bạn không bị rò rỉ bộ nhớ và có thể có các lỗi khác.
Ý tưởng thương mại Philip

7
@JL Ơ? Mã đó là không thể giải thích. Tốt hơn nhiều làvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Với Dispatcher, bạn sẽ cần bao gồm

using System.Windows.Threading;

Cũng lưu ý rằng nếu bạn nhấp chuột phải vào DispatcherTimer và nhấp vào Giải quyết thì nên thêm các tham chiếu thích hợp.


cần thêm tài liệu tham khảo vào WindowsBase.dll btw
George Birbilis

16
IMHO này không trả lời câu hỏi về việc sử dụng điều khiển nào, nó chỉ thêm một số lời bình luận vào câu trả lời được chấp nhận.
Stephen Kennedy

3
Tôi đã thêm điều này vào năm 2012, chỉ cần thực sự bắt đầu như một nhà phát triển, tôi vẫn nhận được điểm cho nó. Nhưng như @StephenKennedy đã chỉ ra, đây nên là một bình luận.
Malcor


0

Bộ hẹn giờ có các chức năng đặc biệt.

  1. Gọi một bộ định thời không đồng bộ hoặc bộ hẹn giờ đồng bộ.
  2. Thay đổi khoảng thời gian
  3. Khả năng hủy bỏ và tiếp tục  

nếu bạn dùng StartAsync () hoặc Start (), luồng không chặn thành phần giao diện người dùng

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


     }

Bạn có thể giải thích mã của bạn? Nếu bạn chỉ đăng một số mã, mọi người sẽ không học hỏi từ đó và chỉ cần sao chép và dán một số mã từ web.
Robert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.