2010-05-03 75 views
4

如何加快WinForms應用程序中UserControls的滾動速度?加速WinForms中的CPU密集型慢速滾動

我的主窗體在慢速機器上快速滾動時遇到問題 - 每個小滾動增量的繪製都是CPU密集型的。

我的窗體大約有50個用戶控件(具有多個字段)定位在另一個之下。 我已經嘗試攔截OnScroll和UserPaint,以消除一些不必要的重繪對於非常小的滾動事件,但底層Paint無論如何被調用。

如何簡化慢速機器上的滾動操作?

+1

一個頁面上的五十個控件太多了 – Benny 2010-05-03 16:32:07

+0

它*很多,雖然那個部分是和屏幕外觀被指定的。屏幕就像是一個複合物品的大網格,通過拖放重新排序。有沒有另外一種方法,使用WinForms來獲得該功能? – 2010-05-03 19:58:54

回答

1

我已經使用標籤來消除滾動。

3

經過驗證的方法是使用離屏位圖,該位圖僅在控件所代表的數據實際發生更改時纔會更新;那麼,OnPaint所需要做的就是將該位圖呈現給屏幕。

如果您的繪畫過程是密集型的,並且由於您擁有如此多的控件,您會發現這對應用程序的性能產生巨大影響。

注意使用DoubleBuffering控制屬性將你的情況沒有幫助 - 它確實告訴的WinForms渲染到屏幕前,渲染到屏幕外的位圖,但仍然在每一個塗料循環發生,因爲沒有按的WinForms」跟蹤該表示何時改變。

所以,你必須推出自己的。這並不困難。以下是看起來像reasonably good article on the subject

2

您還可以增加滾動步驟的大小。例如,

panel1.VerticalScroll.SmallChange = 100; 

將導致面板每次點擊滾動條按鈕時垂直滾動它的內容100個單位。所以你每次都要採取更大的步驟,這可能會讓體驗至少感覺更好。當然你也可以爲水平滾動條做同樣的事情。

+0

這樣可以很好地用箭頭鍵來滾動條按鈕,但不是當您拖動滾動條時。 如果只有這樣一個很好的方式來做拖拽,那也是! – 2010-05-03 19:52:40

+0

@S B,不幸的是,拖動拇指不能像這樣控制。爲了進一步改進,您需要重新考慮您的UI設計。 – 2010-05-03 20:39:23