像C#计时器一样的WPF计时器


177

在哪里可以找到WPF中的C#计时器控件之类的控件?

Answers:


324

通常的WPF计时器是DispatcherTimer,它不是控件,而是在代码中使用。它的工作原理基本上与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
}

可以在这里找到有关DispatcherTimer的更多信息


嗨,我一直在尝试使用调度计时器,但我在intelisense中找不到它,是否需要添加任何引用才能使用它?
yohannes 2012年

2
我喜欢您设置时间间隔的方式,我认为这要好于毫秒。
JL。

关闭表单时,请确保调用dispatcherTimer.Stop()。WinForms版本的计时器会自动执行此操作。(这是将计时器设置为控件的优势。)如果不这样做,则会发生内存泄漏和其他错误。
菲利普

7
@JL Eh?该代码无法解释。更好的是var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

使用Dispatcher,您将需要包括

using System.Windows.Threading;

还要注意,如果右键单击DispatcherTimer并单击“解析”,则应添加适当的引用。


需要添加对WindowsBase.dll btw的引用
George Birbilis

16
恕我直言,这不会回答有关使用哪个控件的问题,而只是在接受的答案中添加一些注释。
斯蒂芬·肯尼迪

3
我在2012年添加了此功能,只是作为开发人员真正开始时,我仍然对此有所收获。但是正如@StephenKennedy指出的那样,这应该是一条评论。
马尔科


0

计时器具有特殊功能。

  1. 调用异步计时器或同步计时器。
  2. 更改时间间隔
  3. 取消和恢复的能力  

如果使用StartAsync ()Start (),则该线程不会阻止用户界面元素

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


     }

你能解释一下你的代码吗?如果您只是发布一些代码,人们将不会从中学习,而只是从网络上复制并粘贴一些代码。
罗伯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.