WPF Timer 控件在哪里?

Posted

技术标签:

【中文标题】WPF Timer 控件在哪里?【英文标题】:Where is the WPF Timer control? 【发布时间】:2011-07-21 14:13:21 【问题描述】:

在哪里可以找到类似于 WPF 中的 C# Timer 控件的控件?

【问题讨论】:

【参考方案1】:

通常的 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 的更多信息,请访问here

【讨论】:

嗨,我一直在尝试使用调度计时器,但我在智能感知中找不到它,是否需要添加任何参考资料供我使用? 我喜欢你设置间隔的方式,在我看来比毫秒更好。 请务必在关闭表单时调用 dispatcherTimer.Stop()。计时器的 WinForms 版本会自动执行此操作。 (这就是将计时器设置为控件的优点。)如果不这样做,您将遇到内存泄漏和其他错误。 @JL 嗯?该代码无法解释。更好的是var timer = new DispatcherTimer Interval = TimeSpan.FromSeconds(1) ;【参考方案2】:

使用 Dispatcher,您需要包含

using System.Windows.Threading;

还请注意,如果您右键单击 DispatcherTimer 并单击 Resolve,它应该添加适当的引用。

【讨论】:

需要添加对 WindowsBase.dll 的引用 恕我直言,这并没有回答关于使用哪个控件的问题,它只是为接受的答案添加了一些评论。 我在 2012 年添加了这个,刚开始作为开发人员,我仍然可以得到积分。但正如@StephenKennedy 指出的那样,这应该是一条评论。【参考方案3】:

你也可以使用

using System.Timers;
using System.Threading;

【讨论】:

【参考方案4】:

定时器有特殊功能。

    调用异步定时器或同步定时器。 更改时间间隔 能够取消和恢复

如果你使用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;
        
    


     

【讨论】:

你能解释一下你的代码吗?如果您只是发布一些代码,人们不会从中学习,而只是从网络上复制和粘贴一些代码。

以上是关于WPF Timer 控件在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

在 WinForms 应用程序中使用 WPF,将应用程序资源放在哪里?

wpf窗体添加事件的地方在哪里?

从哪里开始作为前端 WPF / Xaml 开发人员 [关闭]

wpf不能使用win form的timer控件怎么办

wpf combox 在哪里设置下拉框的宽度和高度