【问题标题】:Calculating ScrollBar scroll percent; height of ScrollBar "bar"?计算 ScrollBar 滚动百分比;滚动条“栏”的高度?
【发布时间】:2014-07-02 12:47:03
【问题描述】:

我试图确定滚动条的百分比值以响应其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 阅读,那里没有任何东西可以告诉我酒吧本身的高度。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    由于非零拇指高度,滚动条位置存在固有的歧义。您认为拇指的哪一侧是“活跃”一侧? 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...
            }
        }
    

    【讨论】:

    • 对我来说奇怪的是,一旦你可以滚动,最大值就会从 100 变为 content.Height - container.ClientSize.Height 公式。
    【解决方案2】:

    您可以像这样以百分比计算垂直滚动位置:

     int percent_v = (int) Math.Min(100f * container.VerticalScroll.Value / 
                     (content.Height - container.ClientSize.Height), 100);
    

    这里的容器是面板,内容可能是图片框或您放置在其中的任何其他内容。

    我看起来有点奇怪,确实如此。当滚动到最大值时,该值不是真正的最大值,而是减少了包含控件的高度。

    对于水平滚动同样适用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 2013-06-08
      • 1970-01-01
      • 2013-10-07
      • 2011-10-19
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多