[英]C# WinForms: Make panel scrollbar invisible
我有一个带有AutoScroll = true
的panel1
。我必须使用btnUp
和btnDown
使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);
}
}
}
图片示例:
您必须在面板上将AutoScroll
选项设置为False 。 我希望您理解我所做的并让您的面板按您想要的方式运行。 如果您有任何问题,请随时提问。
Panel 控件通过将 AutoScroll 设置为 true 来承担您赋予它的职责。 这始终包括在必要时显示滚动条小工具。 因此,您尝试的操作无法正常工作,隐藏垂直滚动条会强制面板重新计算布局,因为这样做会更改客户区。 它当然会发现需要滚动条并立即使其再次可见。
执行此操作的代码,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 是包含控件的内部面板。 当您使用设计器在其上放置控件时要小心,它有给它们错误的父级的诀窍。 请务必使用查看 + 其他窗口 + 文档布局帮助窗口,以便您可以看到这是否出错。 填充后,将其 AutoSizeMode 属性设置为 GrowAndShrink,使其对齐到最小尺寸。
您可以使用
FlowLayoutPanel.AdjustFormScrollbars(false);
尝试这个:
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.
你可以试试这个来解决这个问题,我已经从这个链接复制了它。
如果 AutoScroll 设置为 true,则无法修改 VerticalScroll 或 HorizontalScroll 中的任何内容。 AutoScroll的意思是AutoScroll; 控件决定滚动条何时可见、最小值/最大值是多少等等,您无法更改任何内容。 因此,如果您想自定义滚动(例如隐藏滚动条),您必须将 AutoScroll 设置为 false。
查看带有 Lutz Roeder 的 .NET 反射器的 ScrollableControl 的源代码,您可以看到,如果 AutoScroll 设置为 true,它会忽略您尝试更改 VerticalScroll 或 HorizontalScroll 属性(例如 MinValue、MaxValue、Visible 等)中的属性值的尝试。
将 AutoScroll 设置为 false,您可以更改 VerticalScroll.Minimum、VerticalScroll.Maximum 和 VerticalScroll.Visible 值。 但是,您不能更改 VerticalScroll.Value !!! 哇! 如果您将其设置为非零值,它会将自身重置为零。 相反,您必须设置 AutoScrollPosition = new Point( 0, desired_vertical_scroll_value ); 最后,令人惊讶的是,当您分配正值时,它会将它们翻转为负值,因此如果您检查 AutoScrollPosition.X,它将为负值! 将其分配为正值,它返回为负值。 所以是的,如果您想要自定义滚动,请将 AutoScroll 设置为 false。 然后设置 VerticalScroll 和 HorizontalScroll 属性(Value 除外)。 然后要更改滚动值,您需要设置 AutoScrollPosition,即使您没有使用自动滚动! 最后,当您设置 AutoScrollPosition 时,它将采用您分配给它的相反(即负)值,因此如果您想稍后检索当前 AutoScrollPosition,例如如果您想通过拖动鼠标来偏移滚动值要平移,那么您需要记住在将 AutoScrollPosition 返回的值重新分配给 AutoScrollPosition 并带有一些偏移量之前否定它。 哇。 哇。
另一件事,如果您尝试使用鼠标平移,请使用 Cursor.Position 的值而不是鼠标事件参数返回的任何鼠标位置。 滚动控件也会导致事件参数值发生偏移,这将导致它开始触发鼠标移动事件,并带有不需要的值。 只需使用 Cursor.Position,因为它将使用鼠标屏幕坐标作为固定参考框架,这正是您尝试平移/偏移滚动值时所需要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.