WinForm:禁用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控件。此方法参考了这个页面的内容:

.net - How can you stop a Winforms Panel from scrolling? - Stack Overflow

新建类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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
WinForm 中,如果你需要重绘 Panel 控件中的滚动条,可以通过以下步骤来实现: 1. 继承 Panel 控件,自定义一个 MyPanel 类。 ```csharp public class MyPanel : Panel { // 重写 OnPaint 方法 protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 在此处绘制滚动条 } } ``` 2. 在 MyPanel 类中重写 OnPaint 方法,在该方法中绘制滚动条。 ```csharp protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 绘制垂直滚动条 if (this.VerticalScroll.Visible) { var thumbRect = this.VerticalScroll.ThumbRect; var trackRect = this.VerticalScroll.TrackRect; // 绘制轨道 e.Graphics.FillRectangle(Brushes.Gray, trackRect); // 绘制滑块 e.Graphics.FillRectangle(Brushes.DarkGray, thumbRect); } // 绘制水平滚动条 if (this.HorizontalScroll.Visible) { var thumbRect = this.HorizontalScroll.ThumbRect; var trackRect = this.HorizontalScroll.TrackRect; // 绘制轨道 e.Graphics.FillRectangle(Brushes.Gray, trackRect); // 绘制滑块 e.Graphics.FillRectangle(Brushes.DarkGray, thumbRect); } } ``` 在上述代码中,我们首先判断垂直滚动条和水平滚动条是否可见,如果可见,则获取滑块和轨道的矩形区域,然后使用 GDI+ 绘制滑块和轨道。 3. 将 Panel 控件替换为 MyPanel 控件,即可在运行时看到自定义的滚动条。 注意:如果你的 Panel 控件中包含其他控件,需要考虑它们的位置和大小,以确保滚动条的正确绘制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值