计时器速度问题WPF

问题描述:

我正在使用计时器来滚动列表。每发生一个毫秒的时间间隔,我都会启动Tick事件。尽管动画看起来非常缓慢。计时器速度问题WPF

repeatTimer_Tick(this, new EventArgs()); 
     repeatLeftTimer.Interval = TimeSpan.FromMilliseconds(1); 
     repeatLeftTimer.Tick += new EventHandler(repeatTimer_Tick); 
+0

是WPF还是ASP.NET?这些技术不能一起工作,包括两个标签都没有意义... – 2011-05-02 09:28:55

Windows中的计时器有几毫秒的分辨率,IIRC,10个50毫秒之间的事情。你不能让普通定时器每毫秒打勾。

+0

有没有解决方案? – Geeth 2011-05-02 09:37:28

+1

我认为计时器分辨率最好是13ms。这是〜75fps。你的动画真的需要超过75fps吗?如果您必须使用计时器设置动画,则使用增量计算前一帧与动画之间的增量值。 – 2011-05-02 09:39:54

+1

我认为最简单的方法是使用'BackgroundWorker',在'ProgressChanged'事件处理程序中滚动你的列表框,并在'Sleep(1000)'循环中调用'yourWorker.ReprotProgress' ... – 2011-05-02 09:41:09

你有两个很好的和(相对)容易选择:

  1. 使用动画 - WPF有一个非常通用的动画系统,它很可能是能够做你所需要的。

  2. 使用CompositionTarget.Rendering事件,尽可能快地调用这些事件(每帧),并且每次调用都需要负责根据当前时间设置当前状态(即内置动画的工作方式)

+0

我有一个列表框,其中有1000条记录。我已经订购了5行和每列的记录。我想横向移动每一列 – Geeth 2011-05-02 10:01:00

+0

@Geetha - 好的,你仍然有这两个选项,你可以使用DoubleAnimation来滚动列,或者你可以使用CompositionTarget.Rendering和一些数学运算 - 这是创建的系统来支持WPF中的流畅动画 – Nir 2011-05-02 10:30:27

如果您需要高分辨率,那么我建议您查看Stopwatch类。使用“频率”字段和ElapsedTicks属性来获取您正在查找的分辨率。请注意,秒表的分辨率将根据硬件而改变。阅读msdn文档的链接以获取更多信息。

我会尝试使用你正在做的动画。

.NET定时器类通常具有15.6 ms的最小间隔。如果您需要更快的增量(降至1毫秒),则Windows会在非托管API中提供多媒体计时器。你可以导入这个计时器并使用它 - 我已经完成了,它可以工作。

我根据我的代码断这样的:http://www.codeproject.com/KB/miscctrl/lescsmultimediatimer.aspx

应该是你最需要的东西;我添加了一些代码来观察高分辨率定时器并观察刻度之间的时间 - 我能够达到1ms,+ = 0.10 ms