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

  

时间: 2024-11-12 13:03:57

Winfrom Panel Scroll End 的实现的相关文章

[.NET]让Panel对Mouse滚轮事件(Wheel)有感觉,而且能触发Scroll事件

之前有写了一篇"让Panel对Mouse滚轮事件(Wheel)有感觉",是透过 SendMessage 的方式去叫 Panel Scroll. 但是却不会触发Panel的Scroll事件.那怎么办呢? 在之前有写了一篇"让Panel对Mouse滚轮事件(Wheel)有感觉",是透过 SendMessage 的方式去叫 Panel Scroll. 但是却不会触发Panel的Scroll事件.那怎么办呢? 所以我们可以透过Control.FromHandle来取到那个控

js判断用户是否正在滚动滚动条,滚动条滚动是否停止

js智能判断是否可以自动滚动 比如,做一个音乐播放器,边播放,边定位歌词,播放的时候,需要自动定位到播放语句,但是用户去拖动或者滚动div(歌词面板)时,这时就必须停止自动滚动,或者说是不能自动滚动,这个怎么做呢? 如果能时时判断 用户是否在滚动就好了? 或者能够 知道滚动开始 和 结束事件 也行? 可惜均不知道! 目前,仅可以利用的就是div元素的滚动事件,下面是我的实现思路,如何判断用户是否滚动停止? 1.html代码 <div id="panel"> <div

Sencha学习笔记4: Creating your First App - 官方创建您的第一个Sencha Touch应用指导

英文原文地址:http://docs.sencha.com/touch/2.3.1/#!/guide/first_app (天地会珠海分舵声明:本翻译文章建议读者参照英文原文进行阅读,因为原文包含了实时代码编辑和预览的功能,这在csdn是不能做到的,所以下面只是提供了相应的截图,而非真实的演示) Required Software 软件需求 请参考<Sencha学习笔记1: Getting Started with Sencha Touch - 官方Sencha Touch入门指南> Crea

基于jQuery鼠标滚轮滑动到页面节点部分

基于jQuery鼠标滚轮滑动到页面节点部分.这是一款基于jQuery+CSS3实现的使用鼠标滚轮或者手势滑动到页面节点部分特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <section class="panel home" data-section-name="home"> <div class="inner"> <header> <h1></h1> <

使用鼠标滚轮或者手势滑动到页面节点部分

css部分: <style> .demo{width:300px; margin:60px auto 10px auto;text-align:center} @media only screen and (min-width: 420px) { .demo{width:500px; margin:60px auto 10px auto} } html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, bl

winfrom 圆角panel

首先后台添加命名空间 using System.Drawing.Drawing2D; 后台代码 namespace Report.Web { public partial class RoundPanel : Panel { private int mMatrixRound = 8;//圆角大小默认值 private Color mBack; //重新定义背景颜色 public Color Back { get { return mBack; } set { if (value == null)

winfrom中将panel另存为图片

private void button1_Click(object sender, EventArgs e)        {            Point ScrollMaxInfo = GetScrollPoint(panel1);            Size ControlMaxSize = GetControlSize(panel1, ScrollMaxInfo); Bitmap ControlImage = new Bitmap(ControlMaxSize.Width, Co

ngui3.5.7 版本Scroll View实现方法

现在网上的教材都是老版本的,现在的版本并没有Drag Panel Contents脚本,所以我对着现在的DEMO琢磨出了实现方法 第一,创建NGUI ui,其他组件不必创建,我只要NGUI这个摄影机,将这个NGUI设置为2D层,下面子组件都属于2D层 创建Scroll View,之后在下面创建Grid把他里面的脚本去掉,添加UICenterOnChild这个脚本,之后在Grid下面创建你要用的组件,在这些组件上添加UIDrag Scroll View和UICenter On Click 还有Bo

Bootstrap~Panel和Table

在我们对一个页面进行设计时,分块是必须的,没有一个网站是一栏而下的,除非你是在看小说,否则你的页面设计一定是分块的,即它由于多个panel组件,在bootstrap里叫到栅格系统,而在每行每列进行宏观的布局后,就是在每一个大块里建立小块,而小块可以使用Panel来实现,下面看个例子 <div class="panel panel-default"> <div class="panel-heading">Panel heading withou