计算滚动条滚动百分比;滚动条的高度"

本文关键字:滚动条 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或者其他你放置在里面的东西。

我看起来有点奇怪,它是。当滚动到最大值时,该值不是真正的最大值,而是由包含控件的高度减小。

对于水平滚动同样适用。

免责声明:这是我通过测试发现的;