设置不允许任何滚动时VScrollBar.LargeChange

时间:2014-12-29 02:42:43

标签: c#

我无法正确设置VScrollBar。

我在表单上有许多子面板,逻辑告诉我将SmallChange设置为1的高度,并将LargeChange设置为用户当前可以看到的组合高度。

但是拇指选项卡保持最大化并且在调整窗体大小之前不允许滚动(重置LargeChange以匹配新的窗体高度)。一旦调整大小,一切都按预期工作。

任何人都可以对这种行为有所启发,以及我应该采取哪些措施来解决这个问题。

编辑:

似乎对这个问题存在误解。代码工作正常,但仅在表单调整大小之后。因为根据resize事件在初始化时调用相同的代码,所以当表单首次打开时,我对锁定滚动条的内容感到困惑。可以将代码剪切/粘贴到任何表单上进行演示。

编辑2:

我得到了它的工作,但我又想知道为什么......

在我调用的构造函数的底部:

ResetScrollbar();

我现在连续三次打电话(两次没用)。

ResetScrollbar();
ResetScrollbar();
ResetScrollbar();

这并不令人满意,因为它有些聪明。但这可能有助于某人向我解释问题。我不认为这个黑客可以解决这个问题。

CODE:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace VScrollBarTest
{
    public partial class Form1 : Form
    {
        private const int SubPanelHeight = 50;
        private const int SubPanelCount = 10;
        private Panel mainPanel;
        private VScrollBar mainScrollBar;
        private Panel scrollPanel;

        public Form1()
        {
            InitializeComponent();

            Height = 400;

            mainPanel = new Panel()
            {
                Dock = DockStyle.Fill,
                Parent = this,
            };

            mainScrollBar = new VScrollBar()
            {
                Minimum = 0,
                Value = 0,
                SmallChange = SubPanelHeight,
                Parent = mainPanel,
                Dock = DockStyle.Right,
            };

            scrollPanel = new Panel()
            {
                Left = 0,
                Top = 0,
                Width = mainPanel.Width - SystemInformation.VerticalScrollBarWidth,
                Height = SubPanelCount * SubPanelHeight,
                Parent = mainPanel,
            };

            for (int i = 0; i < SubPanelCount; i++)
            {
                Panel p = new Panel()
                {
                    Parent = scrollPanel,
                    Left = 0,
                    Top = i * SubPanelHeight,
                    Width = scrollPanel.Width,
                    Height = SubPanelHeight,
                    Text = "Sub Panel " + (i + 1).ToString(),
                    BorderStyle = BorderStyle.FixedSingle,
                    BackColor = Color.White,
                    Tag = i,
                };

                Label l = new Label()
                {
                    Parent = p,
                    Text = "Panel " + (i + 1).ToString(),
                    Left = 10,
                    TextAlign = ContentAlignment.MiddleLeft,
                };

                l.Top = (SubPanelHeight - l.Height) / 2;
            }

            Resize += Form3_Resize;
            mainScrollBar.Scroll += mainScrollBar_Scroll;

            ResetScrollbar();
        }

        private void Form3_Resize(object sender, EventArgs e)
        {
            ResetScrollbar();
        }

        private void mainScrollBar_Scroll(object sender, ScrollEventArgs e)
        {
            scrollPanel.Top = -e.NewValue;
        }

        private void ResetScrollbar()
        {
            mainScrollBar.LargeChange = ((int)(mainPanel.Height / SubPanelHeight)) * SubPanelHeight;
            mainScrollBar.Maximum = SubPanelCount * SubPanelHeight - (scrollPanel.Height < mainPanel.Height ? scrollPanel.Height : mainPanel.Height) + mainScrollBar.LargeChange - 1;
        }
     }

}

1 个答案:

答案 0 :(得分:0)

创建新的 scrollBar 时,默认值最大值为100 。部分:

mainScrollBar.LargeChange = ((int)(mainPanel.Height / SubPanelHeight)) * SubPanelHeight;

给出 mainScrollBar.LargeChange = 350 ,它大于最大(它不能),所以它自动将它设置为101.然后你计算最大值( mainScrollBar.LargeChange = 101)

mainScrollBar.Maximum = SubPanelCount * SubPa........ = 238

再次小于350,最后设置 mainScrollBar.LargeChange = 239

您需要计算首先 最大,然后计算 LargeChange

mainScrollBar.Maximum = SubPanelCount * SubPanelHeight - 1;
mainScrollBar.LargeChange = mainPanel.Height;