C#:禁用Panel容器滚动条自动移动位置的功能

今天遇到了一个问题,描述如下:

有一个Panel容器,将AutoScroll属性设置为True,此时Panel容器会在内容过多时自动展示一个滚动条。这个滚动条存在一个缺点,即会随着焦点变化自动滚向焦点位置。

如果仅初始化界面时Panel滚动条位置变化,可在赋值完毕后执行如下代码将滚动条滚回指定位置(其中pnlXXX为Panel的名字):

this.pnlXXX.VerticalScroll.Value = 0;

不过今天又遇到了另一个更加棘手的场景,我的一个控件需要使用Timer重复操作,操作间隔为1秒。如果焦点离开指定的Panel,Panel的滚动条会在1秒以内滚离位置。

有一个治标不治本的方法就是在Timer操作前记录位置并在操作后将滚动条滚回,代码如下:

System.Drawing.Point CurrentPoint; 
CurrentPoint = pnlXXX.AutoScrollPosition; 

//TODO:会触发滚动条位置变动的代码

pnlXXX.AutoScrollPosition = new Point(Math.Abs(pnlXXX.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y)); 

这个方法有一个缺点,就是滚动条经过两次拉动后屏幕会有明显闪动,从用户体验的角度上说肯定是不合适的。

最后还是求助谷歌找到了一个最为稳妥的办法,重写Panel控件。此方法参考了这个页面的内容:

http://stackoverflow.com/questions/419774/how-can-you-stop-a-winforms-panel-from-scrolling/912610#912610

新建类PanelWithoutAutoScroll继承Panel,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PanelScrollTest
{
    class PanelWithoutAutoScroll : Panel
    {
        protected override System.Drawing.Point ScrollToControl(Control activeControl)
        {
            return DisplayRectangle.Location;
        }
    }
}

将Panel替换为PanelWithoutAutoScroll即可实现Panel的滚动条不随焦点变化而自动改变位置。

END

转载于:https://my.oschina.net/Tsybius2014/blog/776326

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值