C# - 表单的Horizo​​ntalScroll保持重置为零

时间:2016-02-04 06:37:24

标签: c# winforms

我知道我在这里错过了一些愚蠢的东西。我正在尝试设置一个没有可见滚动条的表单,但仍允许通过自定义按钮/控件滚动。

我设置了一个空白的新WinForms项目,将一个随机用户控件放在一个超出表单边界的位置 - 我可以滚动到这个位置。

然后我设置了一个按钮(仅用于测试目的),用于在点击时滚动,如下所示:

private void btnScrollRight_Click(object sender, EventArgs e)
{
    this.HorizontalScroll.Value += 10;
}

当我运行这个并单击按钮时,表单移动/滚动一瞬间,但随后立即将Horizo​​ntalScroll.Value重置为0,然后我回到原始视图。

现在,如果我启用AutoScroll属性,那么这个按钮工作得很好 - 它按预期滚动,但我最终得到一个可见的水平滚动条,我还没有找到隐藏它的好方法。我已经尝试将HScroll设置为false,我尝试将Horizo​​ntalScroll.Visible设置为false,但都不起作用。

我读过这篇文章: https://social.msdn.microsoft.com/Forums/windows/en-US/6b9c2c72-e91a-40f0-a835-c12328490c0c/how-to-scroll-without-a-scrollbar-or-make-scrollbar-invisible?forum=winforms

......那里有一些选择,但我觉得我可能只是缺少一些基本的东西。此外,一切似乎都倒置了 - 人们说当你设置AutoScroll时,你不能以编程方式改变任何东西,但这与我所看到的相反。

在我走上一条巧妙的方法来“欺骗”滚动条隐藏或强迫滚动条以其他奇怪的方式执行之前,有没有人对PROPER方式有任何建议吗?

2 个答案:

答案 0 :(得分:1)

我得到以下代码可供我使用:

    int sc = 0;

    private void button2_Click(object sender, EventArgs e)
    {
        sc += 10;
        this.HorizontalScroll.Value = sc;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.HorizontalScroll.Enabled = true;
        this.HorizontalScroll.Maximum = 500; //Calculate this value
    }

仅当控件超出表单的限制并且滚动直到控件和表单的边缘相交时才有效。

计算控件的扩展程度并将最大滚动值设置为大于该值,这一点非常重要,否则您将获得异常。

答案 1 :(得分:1)

以下是如何使其发挥作用。

首先,在表单Load事件中添加以下代码段:

this.AutoScroll = true;
this.AutoScroll = false;

看起来没有任何意义,但第一行强制表单正确计算虚拟可滚动矩形。

然后你需要操纵AutoScrollPosition并记住否定价值观(不要问我为什么,我不知道作者你所遵循的链接)

private void btnScrollRight_Click(object sender, EventArgs e)
{
    this.AutoScrollPosition = new Point(-AutoScrollPosition.X + 10, -this.AutoScrollPosition.Y);
}