繁体   English   中英

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

[英]C# WinForms: Make panel scrollbar invisible

我有一个带有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);
        }
    }
}

图片示例:

图1图2

您必须在面板上将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.

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

行为观察 1:

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

查看带有 Lutz Roeder 的 .NET 反射器的 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 ); 最后,令人惊讶的是,当您分配正值时,它会将它们翻转为负值,因此如果您检查 AutoScrollPosition.X,它将为负值! 将其分配为正值,它返回为负值。 所以是的,如果您想要自定义滚动,请将 AutoScroll 设置为 false。 然后设置 VerticalScroll 和 Horizo​​ntalScroll 属性(Value 除外)。 然后要更改滚动值,您需要设置 AutoScrollPosition,即使您没有使用自动滚动! 最后,当您设置 AutoScrollPosition 时,它将采用您分配给它的相反(即负)值,因此如果您想稍后检索当前 AutoScrollPosition,例如如果您想通过拖动鼠标来偏移滚动值要平移,那么您需要记住在将 AutoScrollPosition 返回的值重新分配给 AutoScrollPosition 并带有一些偏移量之前否定它。 哇。 哇。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM