Winfrom Panel Scroll End 的實現

場景:在一個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;
        }
    }
}
相關文章
相關標籤/搜索