C#WinForms:使面板滚动条不可见

时间:2014-05-28 11:58:06

标签: c# winforms scroll scrollbar panel

我有panel1 AutoScroll = 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;

但它不起作用。任何想法的家伙?

4 个答案:

答案 0 :(得分:8)

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


表单代码:

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);
        }
    }
}

图片示例:

Pic1 Pic2

您必须在面板上将AutoScroll选项设置为 False 。我希望您了解我所做的工作,并让您的面板以您想要的方式运行。如果您有任何问题,请随时询问。

答案 1 :(得分:3)

Panel控件通过将AutoScroll设置为true非常严重来承担您给它的职责。此始终包括在必要时显示滚动条小工具。所以你试过的东西不起作用,隐藏垂直滚动条强制Panel重新计算布局,因为这样做改变了客户区。它当然会发现滚动条是必需的并且会立即再次显示它。

执行此操作的代码,Panel从ScrollableControl继承它,是内部,无法覆盖。这是故意的。

所以使用AutoScroll并不能让你到任何地方。作为替代方案,请记住您真正想要实现的目标。您只想上下移动控件。容易做,只需更改其位置属性。如果你把控件放在另一个面板上,那么反过来最容易做到,大到足以包含它们。将其AutoSize属性设置为True。并实现按钮&#39;只需更改该面板的位置属性即可点击事件处理程序:

    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帮助窗口,以便您可以看到此错误。填充后,将其AutoSizeMode属性设置为GrowAndShrink,使其捕捉到最小尺寸。

答案 2 :(得分:1)

您可以使用

FlowLayoutPanel.AdjustFormScrollbars(false);

答案 3 :(得分:-3)

试试这个:

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

编辑:

实际上当AutoScroll = true时;它将自动处理hscroll和vscroll,你将无法更改它。我在MSDN

上的Panel.AutoScroll Property上找到了这个
 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 !!! WTF!如果将其设置为非零值,则会将其自身重置为零。 相反,您必须设置AutoScrollPosition = new Point(0,desired_vertical_scroll_value); 最后,SURPRISE,当你分配正值时,它会将它们翻转为负值,所以如果你检查AutoScrollPosition.X,它将是负数!将其分配为正数,它返回负数。 所以是的,如果你想要自定义滚动,请将AutoScroll设置为false。然后设置VerticalScroll和Horizo​​ntalScroll属性(Value除外)。然后要更改滚动值,您需要设置AutoScrollPosition,即使您没有使用自动滚动!最后,当您设置AutoScrollPosition时,它将采用您指定给它的相反(即负)值,因此如果您想稍后检索当前的AutoScrollPosition,例如,如果您想通过拖动鼠标来偏移滚动值要平移,那么你需要记住在将AutoScrollPosition重新分配给具有一些偏移量的AutoScrollPosition之前否定AutoScrollPosition返回的值。哇。 WTF。

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