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程序的计时器控件。的主要内容,如果未能解决你的问题,请参考以下文章