计算滚动条滚动百分比;滚动条的高度"
本文关键字:滚动条 quot 高度 百分比 计算 滚动 | 更新日期: 2023-09-27 18:11:12
我试图确定响应其OnScroll
事件的滚动条的百分比值,尽管我很难确定实际百分比。我认为它应该像当前滚动值除以最大值的比率一样简单。尽管这会产生奇怪的结果。
void ThePanel_Scroll(object sender, ScrollEventArgs e)
{
if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
{
double scrollPercent = (double)e.NewValue / (double)ThePanel.VerticalScroll.Maximum;
Console.Out.WriteLine("Max: " + ThePanel.VerticalScroll.Maximum + " Min: " + ThePanel.VerticalScroll.Minimum);
Console.Out.WriteLine("OldVal: " + e.OldValue + " NewVal: " + e.NewValue + " Val: " + ThePanel.VerticalScroll.Value);
Console.Out.WriteLine("CurPer: " + scrollPercent);
}
}
当运行这段代码,并滚动条到最大位置时,我可能会得到如下输出
Max: 529 Min: 0
OldVal: 170 NewVal: 170 Val: 170
CurPer: 0.321361058601134
即使滚动条处于最大位置,其Value
也不是。我认为原因是Value
是基于滚动条的顶部。我的问题是,我不能确定滚动条"条"本身的高度/大小,以计算一个适当的百分比。
是正确的方法来确定基于使用与Value
柱的高度百分比,还是我错过了别的东西?如果它是基于高度的,我怎么确定它?通读VScrollProperties MSDN没有任何东西可以告诉我工具条本身的高度。
由于拇指高度非零,滚动条位置存在固有的模糊性。你认为拇指的哪一侧是活跃的?Windows不能帮你处理这个问题,当拇指接近最大位置时,它会突然从一边切换到另一边。如果你不进行补偿,那么你将失去一部分范围。
解决方法是去掉翻转行为的刺痛,并应用自己的有效最大值。这样的:
private void panel1_Scroll(object sender, ScrollEventArgs e) {
if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) {
var max = panel1.VerticalScroll.Maximum - panel1.VerticalScroll.LargeChange;
var pos = Math.Min(max, e.NewValue);
var percentage = 100.0 * pos / max;
// etc...
}
}
你可以像这样计算垂直滚动条位置的百分比:
int percent_v = (int) Math.Min(100f * container.VerticalScroll.Value /
(content.Height - container.ClientSize.Height), 100);
这里的容器可以是Panel,而内容可以是Picturebox或者其他你放置在里面的东西。
我看起来有点奇怪,它是。当滚动到最大值时,该值不是真正的最大值,而是由包含控件的高度减小。
对于水平滚动同样适用。
免责声明:这是我通过测试发现的;