【问题标题】:Custom scrollbar scrolling triggers AutoScroll scrollbars自定义滚动条滚动触发 AutoScroll 滚动条
【发布时间】:2018-06-24 09:47:14
【问题描述】:

我一直在使用 UserControl 来显示控件列表。我最初启用了AutoScroll,然后选择不使用它。我选择不使用它,因为它很突出,而且与我一直在使用的控件主题“看起来”不太好。

我对一个名为 MetroFramework 的框架进行了测试,并选择使用 MetroScrollBar 滚动条控件作为垂直滚动条。

我已经完全禁用了 AutoScroll,然后我决定实现 Scrollbar。我只是这样做的:

scbMain.Scroll += (sender, e) => { VerticalScroll.Value = scbMain.Value; };

scbMain 是我正在讨论的滚动条)

这可行,但不如预期。当我滚动时,我会从默认滚动条中得到一个疯狂的闪烁效果,如here 所示。更长的列表有the same effect, but more pronounced

我试图隐藏现有的滚动条:

VerticalScroll.Visible = false;
HorizontalScroll.Visible = false;
VerticalScroll.Enabled = false;
HorizontalScroll.Enabled = false;

这对解决我的问题没有任何影响。

需要注意的是:我的滚动条停靠在右侧,UserControl内没有其他容器控件。

【问题讨论】:

  • 信息太少,没有代码。如果您可以提供一些重现闪烁的最小代码,它将涉及更多的人来帮助您。
  • 很抱歉,这是我用于滚动效果的唯一代码。
  • 我说“重现闪烁的最小代码”。目的是自己运行
  • 当然:我已将代码隔离在 new project and chucked it on GitHub 中。希望这会有所帮助。
  • 顺便说一句,问题仍然存在。我在UserControl 区域之外放置了一个按钮 - 它不太明显,但您可以通过添加更多控件来渲染来增加它的可见性。

标签: c# scrollbar


【解决方案1】:

好的。问题解决了。问题出在这行代码中:

scbMain.Scroll += (sender, e) => { ----> /*(Here*/ VerticalScroll.Value = scbMain.Value; <---- };

您实际上是在设置用户控件的滚动值,基本上是您告诉系统调用 autoscroll 属性来设置值!

正确的方法是不要自动滚动用户控件,而是滚动一个容器,例如一个面板。因此,在您的用户控件中添加一个面板。您将滚动面板和其中的所有控件(在此示例中,我将添加按钮)。

this.btnExample.Location = new System.Drawing.Point(62, 0);
this.btnExample.Name = "btnExample";
this.btnExample.Size = new System.Drawing.Size(75, 390);
this.btnExample.TabIndex = 1;
this.btnExample.Text = "Out of Bounds";
this.btnExample.UseVisualStyleBackColor = true;

this.panel1.Controls.Add(this.btnExample);
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(270, 391); //the width must fit inside your user control and the height was arbitrary
this.panel1.TabIndex = 2;

this.Controls.Add(this.panel1);
this.Controls.Add(this.scbMain);
this.Name = "CtrlScroll";
this.Size = new System.Drawing.Size(474, 300);

滚动:

public CtrlScroll() {
        InitializeComponent();

        scbMain.Scroll += ( sender, e ) => {
            //Normally the if statement whouldn't be needed but the metro srollbar
            //has a weird behaviour when the scroll value becomes max
            if( scbMain.Value > panel1.Height - this.Height ) {
                panel1.Top = -( panel1.Height - this.Height );
            }
            else {
                panel1.Top = -scbMain.Value;
            };
        };

        int maxVertical = panel1.Height;

        // SmallChange is typically 1%.
        int smallChangeVertical = Math.Max( (int)( maxVertical / 100 ), 1 );

        // LargeChange is one page.
        int largeChangeVertical = this.Height;

        scbMain.Minimum = 0;
        scbMain.Maximum = maxVertical;
        scbMain.SmallChange = smallChangeVertical;
        scbMain.LargeChange = largeChangeVertical;
    }

【讨论】:

  • 非常感谢!我已经通过一些细微的调整(即隐藏滚动条等)将其提交给 GitHub 存储库——当然,这归功于您的解决方案!你救了我的命,谢谢!
  • @AlexM。很高兴我帮助了
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多