什么是在ScrollableControl中使用HScroll / VScroll?

时间:2017-09-15 02:29:23

标签: c# winforms scrollable

ScrollableControl类有2个受保护的布尔属性:HScroll和VScroll。

正如document所说:

  

获取或设置一个值,指示水平滚动条是否可见。

  

AutoScroll会自动保持滚动条的可见性。因此,启用AutoScroll时,将HScroll或VScroll属性设置为true无效。

所以我像这样使用它们,但滚动条没有显示:

class MyScrollableControl : ScrollableControl {
    public MyScrollableControl() {
        this.AutoScroll = false;
        this.HScroll = true;
    }
}

如果我使用以下代码,它可以工作:

this.HorizontalScroll.Visible = true;

当我把它们放在一起时,滚动条仍然是不可见的,并且HScroll和Horizo​​ntalScroll.Visible的值保持为False。

this.AutoScroll = false;
this.HScroll = true;
this.HorizontalScroll.Visible = true;

那么HScroll和VScroll的实际用途是什么?

更新

我的代码和测试

enter image description here

3 个答案:

答案 0 :(得分:6)

HScroll属性不会直接影响滚动可见性,但阻止隐藏滚动 HorizontalScroll.Visible

enter image description here

如果HorizontalScroll.Visible设置为trueHScroll也会获得值true(请参阅表格中的第2行)

如果AutoScroll设置为true,则HorizontalScroll.Visible始终保持trueHScroll不会有任何影响(请参阅最后2行)

使用包含带有下一个处理程序代码的3个按钮的控件创建一个应用程序,并使用它来查看那里到底发生了什么:

private void button1_Click(object sender, EventArgs e)
{
    AutoScroll = !AutoScroll;
    SetValues();
}

private void button3_Click(object sender, EventArgs e)
{
    HScroll = !HScroll;
    SetValues();
}

private void SetValues()
{
    button1.Text = $"Auto: {(AutoScroll ? "On" : "Off")}";
    button3.Text = $"HScroll: {(HScroll ? "On" : "Off")}";
    button2.Text = $"Visible: {(HorizontalScroll.Visible ? "On" : "Off")}";
}

private void button2_Click(object sender, EventArgs e)
{
    HorizontalScroll.Visible = !HorizontalScroll.Visible;
    SetValues();
}

用法(AutoScroll = false

手动将滚动设置HorizontalScroll.Visible显示为true

手动隐藏滚动集HScrollfalse而非HorizontalScroll.Visiblefalse

用法(AutoScroll = true

HorizontalScroll.Visible始终为true且无法更改

HScroll不会影响任何事情

enter image description here

答案 1 :(得分:3)

  

那么HScroll和VScroll的实际用途是什么?

当您具有显示滚动条的意图时,将它们设置为true。但这还不够,你还必须陈述他们应该展示什么。滚动条需要知道拇指大小,最小和最大位置以及当前位置。

你正在与内部ApplyScrollbarChanges() method进行战斗。它做的一件事是隐藏滚动条,即使HScroll或VScroll设置为true,如果它没有足够的信息来配置条形图。该方法的代码太大而不适合这里,简而言之,它从以下内容中获取此信息:

  1. AutoScrollMinWidth属性的值。
  2. 如果控件具有非默认布局,则它允许该控件的布局引擎确定滚动边界。这只是FlowLayoutPanel和TableLayoutPanel控件的情况。
  3. 如果控件具有默认布局,则它会迭代子控件以查看其边界。
  4. 第2项是一个有吸引力的自定义角度,但它们使LayoutEngine类成为内部类,因此您无法获得自己的类。第3项与AutoLayout = true已经完全没有根本区别。它确实有效,只需在构造函数中添加一个控件,重写OnClientSizeChanged()以调用AdjustFormScrollbars(true),然后您就会看到滚动条。

    使第1项控制滚动条。属性设置器显示like this。是的,它偷偷地将AutoScroll属性设置为true:)

    只需设置AutoScrollMinSize属性即可控制滚动条。

答案 2 :(得分:2)

HScroll将显示水平滚动条,AutoScroll属性未定义。

在所有未显示滚动条的示例中,这是因为您将AutoScroll设置为false,隐藏了任何滚动条的显示。