• Winfrom Panel Scroll End 的实现


    场景:在一个panel里面有非常多的自定义绘制的控件,在拖拉滚动条的时候,控件的画面上有残影

    不知道大家遇到过这种情况没,一直做web的winform经验太少,有更好的解决办法请贡献

    首先放出我的解决思路:需要再滚动停止的时候重绘一下控件,panel的所有事件都加了一个打印输出,发现,滚动条在滚动的时候只有一个Scrol事件,是在滚动时候产生的,问题在于轻轻拖动滚动条,就会一瞬间产生N个Scrol,如果直接这个事件里面放重绘代码,太消耗资源,第二这个滚动条除了滚动事件,别的事件都没有,比如鼠标moseup mosedown等

    实在没有办法,写了一个类变现的实现滚动停止的时候执行自己的方法,代码如下,写的不好,抛砖引玉,希望能有更好的解决方式

    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;
            }
        }
    }
    

      

  • 相关阅读:
    redis的几种模式
    redis ,memcache的对比
    忍龙sigma 不升级武器.图书馆百人斩包爽无脑操作攻略
    浏览器刷新或者关闭事件监听 beforeunload pagehide
    Element-Ui实现分页table缓存勾中数据
    [转载]Localtunnel使您可以轻松地在本地开发计算机上共享Web服务,而不会弄乱DNS和防火墙设置。
    cmder 分成四屏
    P3709 大爷的字符串题(莫队+离散化)
    P3604 美好的每一天(莫队+前缀和)
    P4462 [CQOI2018]异或序列(莫队+前缀和)
  • 原文地址:https://www.cnblogs.com/zhaojingjing/p/4481295.html
Copyright © 2020-2023  润新知