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,将应用程序资源放在哪里?