2011-05-02 67 views
2

我正在使用計時器來滾動列表。每發生一個毫秒的時間間隔,我都會啓動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

回答

2

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

0

你有兩個很好的和(相對)容易選擇:

  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

0

如果您需要高分辨率,那麼我建議您查看Stopwatch類。使用「頻率」字段和ElapsedTicks屬性來獲取您正在查找的分辨率。請注意,秒錶的分辨率將根據硬件而改變。閱讀msdn文檔的鏈接以獲取更多信息。

2

我會嘗試使用你正在做的動畫。

.NET定時器類通常具有15.6 ms的最小間隔。如果您需要更快的增量(降至1毫秒),則Windows會在非託管API中提供多媒體計時器。你可以導入這個計時器並使用它 - 我已經完成了,它可以工作。

我根據我的代碼斷這樣的:http://www.codeproject.com/KB/miscctrl/lescsmultimediatimer.aspx

應該是你最需要的東西;我添加了一些代碼來觀察高分辨率定時器並觀察刻度之間的時間 - 我能夠達到1ms,+ = 0.10 ms