C#中简单的问题,关于WPF程序的计时器控件。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中简单的问题,关于WPF程序的计时器控件。相关的知识,希望对你有一定的参考价值。

我在做一个音乐播放器,WPF应用程序,其中有一个功能需要播放时用计时器每秒显示当前播放进度。我在播放按钮下这么写。 DispatcherTimer myTimer = new DispatcherTimer(); myTimer.Interval = new TimeSpan(0, 0, 1); myTimer.Tick += new EventHandler(Timer_Tick); myTimer.Stat(); 这是网上的方法。 计时器的事件已经写好了,关键是需要在暂停时停止计时器。 于是在暂停按钮中写myTimer.Stop();。 然后报错当前上下文中不存在名称“myTimer”,我试过,如果myTimer.Stop();与上面这大段都在播放的事件里,就好使,可是如果Stop与上面这段不在一个事件里,就会报错,求解决办法。

参考技术A 你要把变量的定义放在事件的外面,也就是形如
DispatcherTimer
myTimer
=null;
播放按钮_click(.....)

myTimer
=new
DispatcherTimer();
myTimer.Interval
=
new
TimeSpan(0,
0,
1);
myTimer.Tick
+=
new
EventHandler(Timer_Tick);
myTimer.Stat();

然后在暂停之类的事件中就可以用myTimer了。

WPF Timer 控件在哪里?

【中文标题】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;
        
    


     

【讨论】:

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

以上是关于C#中简单的问题,关于WPF程序的计时器控件。的主要内容,如果未能解决你的问题,请参考以下文章

wpf创建用户控件(计时器控件)

WPF Timer 控件在哪里?

WPF自定义控件之带倒计时的按钮--Button

WPF 实现3D翻转倒计时控件~

c#计时器如何保存计时

winform 中如何获取计时器控件的值