場景:在一個panel裏面有很是多的自定義繪製的控件,在拖拉滾動條的時候,控件的畫面上有殘影web
不知道你們遇到過這種狀況沒,一直作web的winform經驗太少,有更好的解決辦法請貢獻oop
首先放出個人解決思路:須要再滾動中止的時候重繪一下控件,panel的全部事件都加了一個打印輸出,發現,滾動條在滾動的時候只有一個Scrol事件,是在滾動時候產生的,問題在於輕輕拖動滾動條,就會一瞬間產生N個Scrol,若是直接這個事件裏面放重繪代碼,太消耗資源,第二這個滾動條除了滾動事件,別的事件都沒有,好比鼠標moseup mosedown等spa
實在沒有辦法,寫了一個類變現的實現滾動中止的時候執行本身的方法,代碼以下,寫的很差,拋磚引玉,但願能有更好的解決方式orm
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Controller { public delegate void VoidNotify(); /// <summary> /// 滾動中止事件 /// </summary> public class ScrollEnd { private static ScrollEnd instance; private static object Lock = new object(); /// <summary> /// 滾動條事件計數 /// </summary> private static int count = 0; /// <summary> /// Thread Loop 計數器 /// </summary> private static int count2 = 0; /// <summary> /// 通知自定義事件 /// </summary> public static VoidNotify Notify { get; set; } private Thread thread = null; private ScrollEnd() { } public static ScrollEnd GetInstance() { if (instance == null) { lock (Lock) { if (instance == null) { instance = new ScrollEnd(); } } } return instance; } /// <summary> /// 滾動條事件觸發ADD /// </summary> public void Add() { lock (Lock) { if (count2 == 0) { thread = new Thread(new ThreadStart(Run)); thread.IsBackground = true; thread.Start(); } else { count++; } } } /// <summary> /// 經過thread的間隔計數跟滾動事件的計數對比,判斷滾動結束,而後執行自定義事件 /// </summary> private void Run() { while (true) { if (count2 > count) { break; } count2++; Thread.Sleep(30); } if (Notify!=null) { Notify(); } count = 0; count2 = 0; thread = null; return; } } }