【问题标题】:What's the use of HScroll/VScroll in ScrollableControl?ScrollableControl中的Scroll/Scroll有什么用?
【发布时间】:2017-09-15 02:29:22
【问题描述】:

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 的真正用途是什么?


更新

我的代码和测试

【问题讨论】:

  • 请在宿主窗口 onLoad 处理程序中将控件的AutoScroll 设置为false,并检查结果。 Not Set AutoScroll 给了我意想不到的结果

标签: c# winforms scrollable


【解决方案1】:

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

如果HorizontalScroll.Visible 设置为true,那么HScroll 也将得到一个值true(见表中的第二行)

如果AutoScroll 设置为true,HorizontalScroll.Visible 始终保持trueHScroll 没有任何影响(见最后两行)

使用包含 3 个按钮和下一个处理程序代码的 Control 制作一个应用,并使用它来查看那里到底发生了什么:

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.Visibletrue

手动隐藏滚动设置 HScrollfalseHorizontalScroll.Visiblefalse

用法(AutoScroll = true

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

HScroll 不会影响任何东西

【讨论】:

  • 我在 .Net 3.5 和 .Net 4.6 下测试它。但得到与你不同的结果。当 HScroll 或 VScroll 设置为 true 时,更改 Horizo​​ntalScroll.Visible 或 VerticalScroll.Visible 的值将使 HScroll 和 VScroll 都返回 false,并隐藏滚动条。
  • 你能分享你得到的结果吗
  • 在 3.5 上检查,结果添加到答案中(在 4.6 上结果相同)
  • 我已经在帖子中添加了我的。奇怪的事情。也许属性的行为是基于操作系统的?
  • 我在 Win 10 和 WinServer 2012 上检查过,结果相同,我从启用自动开始的差异,将检查
【解决方案2】:

那么 HScroll 和 VScroll 的真正用途是什么?

当您打算显示滚动条时,您将它们设置为 true。但这还不够,您还必须说明它们应该显示的内容。滚动条需要知道拇指大小、最小和最大位置以及当前位置。

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

  1. AutoScrollMinWidth 属性的值。
  2. 如果控件具有非默认布局,则它允许该控件的布局引擎确定滚动边界。这仅适用于 FlowLayoutPanel 和 TableLayoutPanel 控件。
  3. 如果控件具有默认布局,则它会迭代子控件以查看其边界。

第 2 项是一个有吸引力的自定义角度,但他们将 LayoutEngine 类设为内部,因此您无法派生自己的。第 3 项与 AutoLayout = true 已经做的没有根本不同。但是它确实有效,只需在构造函数中添加一个控件,覆盖 OnClientSizeChanged() 以调用 AdjustFormScrollbars(true),您现在将看到滚动条。

留下第 1 项来控制滚动条。属性设置器看起来 like this。是的,它偷偷地将 AutoScroll 属性设置回 true :)

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

【讨论】:

    【解决方案3】:

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

    在所有没有出现滚动条的示例中,这是因为您将 AutoScroll 设置为 false,从而隐藏了所有滚动条的显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多