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

我有一个使用AutoScroll = truepanel1 。我必须使用btnUpbtnDown进行panel1滚动。 到目前为止,我已经做了我的要求

 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; 

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

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


表格代码:

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

图片示例:

PIC1PIC2

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

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

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

所以使用AutoScroll不会让你到任何地方。 作为替代方案,请记住您真正想要实现的目标。 您只想上下移动控件。 容易做,只需更改其位置属性。 如果你把控件放在另一个面板上,大到足以容纳它们,那么这反过来最容易做到。 将其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帮助窗口,以便您可以看到此错误。 填充后,将其AutoSizeMode属性设置为GrowAndShrink,使其捕捉到其最小大小。

试试这个:

 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. 

您可以尝试这个解决此问题,我已从此链接复制它。

行为观察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返回的值。 哇。 跆拳道。

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