c# - 计算 ScrollBar 滚动百分比;滚动条的高度 "bar"?

标签 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那里没有任何东西可以告诉我酒吧本身的高度。

最佳答案

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

关于c# - 计算 ScrollBar 滚动百分比;滚动条的高度 "bar"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24531477/

相关文章:

c# - 如何根据 WPF DataGrid 中的更改更新 ObservableCollection 项的属性?

c# - 如何检查单个数组包含相同的值

c# - 在 TextChanged 事件中将信息从打开的表单传递到打开的表单

c# - C#WinForms相对于另一个表单放置一个表单

c# - 如何在 web.config 之外创建连接字符串

c# - 将原始数据发送到 Zebra TTP 2030 打印机并获取其状态

c# - Winforms 中的后台工作人员不更新 TextBox

vb.net - 无法将字符串转换为类型 'Double'

c# - 在其他所有内容后面显示一个表单,而不窃取焦点?

c# - 在C#中,如何获取空白的XML节点值?