我无法正确设置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;
}
}
}
答案 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;