计算ScrollBar滚动百分比; ScrollBar“bar”的高度?

时间:2014-07-02 12:47:03

标签: c# winforms

我正在尝试确定滚动条响应其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阅读那里没有什么可以告诉我酒吧本身的高度。

2 个答案:

答案 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或其他任何内容。

我看起来有点奇怪而且确实如此。滚动到最大值时,该值不是实际最大值,而是由包含控件的高度减小。

对于水平滚动,同样适用。

免责声明:这是我通过测试发现的;我从未在任何地方看到它。