我正在尝试确定滚动条响应其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
基于滚动条的顶部。我的问题是我无法确定滚动条“bar”本身的高度/大小,以计算适当的百分比。
根据使用条形高度和Value
确定百分比的正确方法,还是我错过了其他内容?如果它是基于高度,我该如何确定?通过VScrollProperties MSDN阅读那里没有什么可以告诉我酒吧本身的高度。
答案 0 :(得分:3)
由于拇指高度非零,滚动条位置存在固有的模糊性。拇指的哪一侧你认为是“活跃”的一面? 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...
}
}
答案 1 :(得分:1)
您可以按以下百分比计算垂直滚动位置:
int percent_v = (int) Math.Min(100f * container.VerticalScroll.Value /
(content.Height - container.ClientSize.Height), 100);
这里的容器将是Panel,内容可能是Picturebox或其他任何内容。
我看起来有点奇怪而且确实如此。滚动到最大值时,该值不是实际最大值,而是由包含控件的高度减小。
对于水平滚动,同样适用。
免责声明:这是我通过测试发现的;我从未在任何地方看到它。