【问题标题】:C# WinForms: Make panel scrollbar invisibleC# WinForms:使面板滚动条不可见
【发布时间】:2020-11-15 08:52:41
【问题描述】:

我有一个panel1AutoScroll = true。我必须让panel1 滚动btnUpbtnDown。到目前为止,我已经完成了我的要求

private void btnUpClicked(Object sender, EventArgs e)
{
    if (panel1.VerticalScroll.Value - 55 > 0)
        panel1.VerticalScroll.Value -= 55;
    else  panel1.VerticalScroll.Value = 0;
}

private void btnDownClicked(Object sender, EventArgs e)
{
    panel1.VerticalScroll.Value += 55;
}

但现在我需要隐藏Scrollbar 或使其不可见。我试过了

panel1.VerticalScroll.Visible = false;

但它不起作用。有什么想法吗?

【问题讨论】:

  • 这就是AutoScroll=true 所做的...自动为您提供滚动条。除非你完全接管行为,否则你不能同时做这两个。
  • 是的,我害怕那个。我能做什么?
  • 好吧,如果你想要它足够糟糕,你可以创建一个继承自 Panel 的新控件,然后实现你自己的滚动。当然,这不是微不足道的,而是可行的。有很多例子可以用计时器等滚动你自己的卷轴。
  • @user3683349 我给了你整个解决方案,只需复制粘贴即可。看看;)

标签: c# winforms scroll scrollbar panel


【解决方案1】:

好的,我已经为您完成了这个工作示例。您所要做的就是根据面板内所有项目的总大小更改最大值。


表格代码:

public partial class Form1 : Form
{
    private int location = 0;

    public Form1()
    {
        InitializeComponent();

        // Set position on top of your panel
        pnlPanel.AutoScrollPosition = new Point(0, 0);

        // Set maximum position of your panel beyond the point your panel items reach.
        // You'll have to change this size depending on the total size of items for your case.
        pnlPanel.VerticalScroll.Maximum = 280;
    }

    private void btnUp_Click(object sender, EventArgs e)
    {
        if (location - 20 > 0)
        {
            location -= 20;
            pnlPanel.VerticalScroll.Value = location;
        }
        else
        {
            // If scroll position is below 0 set the position to 0 (MIN)
            location = 0;
            pnlPanel.AutoScrollPosition = new Point(0, location);
        }
    }

    private void btnDown_Click(object sender, EventArgs e)
    {
        if (location + 20 < pnlPanel.VerticalScroll.Maximum)
        {
            location += 20;
            pnlPanel.VerticalScroll.Value = location;
        }
        else
        {
            // If scroll position is above 280 set the position to 280 (MAX)
            location = pnlPanel.VerticalScroll.Maximum;
            pnlPanel.AutoScrollPosition = new Point(0, location);
        }
    }
}

图片示例:

您必须在面板上将AutoScroll 选项设置为False。我希望你能理解我所做的,并让你的面板按照你想要的方式运行。如果您有任何问题,请随时提出。

【讨论】:

  • 如何设置 pnlPanel.VerticalScroll.Maximum 为自动?我用按钮填充面板我希望它的最大滚动大小是自动的
【解决方案2】:

通过将 AutoScroll 设置为非常严肃,Panel 控件承担了您赋予它的职责。这总是包括在必要时显示滚动条小工具。因此,您尝试的方法不起作用,隐藏垂直滚动条会强制面板重新计算布局,因为这样做会改变客户区域。它当然会发现需要滚动条并立即使其再次可见。

执行此操作的代码,Panel 从 ScrollableControl 继承,是内部,不能被覆盖。这是故意的。

因此,使用 AutoScroll 不会让您有任何帮助。作为替代方案,请牢记您真正想要完成的工作。您只是想上下移动控件。很容易做到,只需更改其 Location 属性。如果您将控件放在 另一个 面板上,这反过来又是最容易做到的,它大到足以容纳它们。将其 AutoSize 属性设置为 True。并通过简单地更改该面板的 Location 属性来实现按钮的 Click 事件处理程序:

private const int ScrollIncrement = 10;

private void ScrollUpButton_Click(object sender, EventArgs e) {
    int limit = 0;
    panel2.Location = new Point(0, 
        Math.Min(limit, panel2.Location.Y + ScrollIncrement));
}

private void ScrollDownButton_Click(object sender, EventArgs e) {
    int limit = panel1.ClientSize.Height - panel2.Height;
    panel2.Location = new Point(0, 
        Math.Max(limit, panel2.Location.Y - ScrollIncrement));
}

其中 panel1 是外部面板,而 panel2 是包含控件的内部面板。使用设计器在其上放置控件时要小心,它有给他们错误的父级的诀窍。一定要使用 View + Other Windows + Document Layout helper 窗口,这样你就可以看到出错了。填充后,将其 AutoSizeMode 属性设置为 GrowAndShrink,使其对齐到最小尺寸。

【讨论】:

    【解决方案3】:

    试试这个:

    panel.AutoScroll = true;
    panel.VerticalScroll.Enabled = false;
    panel.VerticalScroll.Visible = false;
    

    编辑:

    实际上当 AutoScroll = true;它将自动处理 hscroll 和 vscroll 并且您将无法更改它。我在MSDN的 Panel.AutoScroll 属性上找到了这个

     AutoScroll maintains the visibility of the scrollbars automatically. Therefore, setting the HScroll or VScroll property to true has no effect when AutoScroll is enabled.
    

    你可以试试这个来解决这个问题,我已经从这个Link复制了它。

    行为观察 1:

    如果 AutoScroll 设置为 true,则不能修改 VerticalScroll 或 Horizo​​ntalScroll 中的任何内容。 AutoScroll 指 AutoScroll;控件决定滚动条何时可见、最小值/最大值是多少等,您无法更改任何内容。 所以如果你想自定义滚动(例如隐藏滚动条),你必须将 AutoScroll 设置为 false。

    查看带有 Lutz Roeder 的 .NET Reflecter 的 ScrollableControl 的源代码,您可以看到如果 AutoScroll 设置为 true,它会忽略您更改 VerticalScroll 或 Horizo​​ntalScroll 属性中的属性值的尝试,例如 MinValue、MaxValue、Visible等等

    行为观察 2:

    将 AutoScroll 设置为 false,您可以更改 VerticalScroll.Minimum、VerticalScroll.Maximum、VerticalScroll.Visible 的值。 但是,您不能更改 VerticalScroll.Value !!!哇!如果将其设置为非零值,它会将自身重置为零。 相反,您必须设置 AutoScrollPosition = new Point( 0, desired_vertical_scroll_value ); 最后,SURPRISE,当您分配正值时,它会将它们翻转为负值,因此如果您检查 AutoScrollPosition.X,它将是负值!分配它积极,它回来消极。 所以是的,如果你想要自定义滚动,请将 AutoScroll 设置为 false。然后设置 VerticalScroll 和 Horizo​​ntalScroll 属性(Value 除外)。然后要更改滚动值,您需要设置 AutoScrollPosition,即使您没有使用自动滚动!最后,当您设置 AutoScrollPosition 时,它将采用您分配给它的相反(即负)值,因此如果您想稍后检索当前 AutoScrollPosition,例如,如果您想通过拖动鼠标来偏移滚动值要平移,那么您需要记住在将 AutoScrollPosition 返回的值重新分配给具有一定偏移量的 AutoScrollPosition 之前取反。哇。呵呵。

    另一件事,如果您尝试使用鼠标进行平移,请使用 Cursor.Position 的值,而不是鼠标事件参数返回的任何鼠标位置。滚动控件将导致事件参数值也发生偏移,这将导致它开始触发鼠标移动事件,并带有不需要的值。只需使用 Cursor.Position,因为它将使用鼠标屏幕坐标作为固定参考框架,这是您在尝试平移/偏移滚动值时想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2023-03-17
      • 2011-02-02
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多