WinForm局部更新(防止閃爍)

  • 9730
  • 0

相信很多寫WinForm的人也遇到要局部更新UI來避免畫面閃爍,這不是甚麼新的東西。只是最近在寫更複雜的局部更新是遇到一些問題,畫面的更新有延誤,所以研究了一下,得出下面的結論。

以上是我自己的見解,並不見得正確,正確版本請參考MSDN。

 相信很多寫WinForm的人也遇到要局部更新UI來避免畫面閃爍,這不是甚麼新的東西。只是最近在寫更複雜的局部更新是遇到一些問題,畫面的更新有延誤,所以研究了一下,得出下面的結論。

 

一般要局部更新,要先檢查目前的執行緒是worker還是UI,一般會這樣做

 

private void GuiUpdate()
{
if (Control.InvokeRequired)
                    {
                        Control.Invoke(GuiUpdate, new object[] { sender, args });
                    }
else
                    {
                             //do your Control update here.
                     }
}

網路上很多這樣的sample,但其實這樣做並不夠,因為那個delegate送出去後,元件會在系統覺得需要重畫時 才重畫,有點像GC回收Memory,如果需要即時更新,需要做下面的動作。

{
    //do your control update here.
    Control.Invalidate();
    Control.Update();
}

Invalidate方法會告訴系統該元件需要重畫,Update方法會強迫發動重畫。為甚麼這麼麻煩呢?其實這裡的原理 有點像SQL的Transaction,也就是bulk或者叫batch。他們之間的關係可以看下面的圖。

所以可以累積一定數量的Invalid元件,再選擇一個時間點全部重畫,以提升效能。 以上是我自己的見解,並不見得正確,正確版本請參考MSDN。

 

My WP Blog with english technical docs.