【问题标题】:ScrollBar value set incorrectlyScrollBar 值设置不正确
【发布时间】:2011-05-28 00:55:35
【问题描述】:

我正在尝试实现类似于 Excel 的“无限”可滚动性;用户可以滚动到文档的“底部”;但随后继续滚动(使用滚轮或滚动条上的向下箭头),并且为它们生成更多空行。我大部分时间都在工作(使用鼠标滚轮时它工作得很好);但我在使用 SmallIncrement 功能时遇到了问题——也就是说;当用户单击滚动条上的向下箭头时,它应该向下滚动滚动条。SmallChange,尽管它位于滚动条可滚动范围的底部。

这是我的代码(在 scrollBar_Scroll 的处理程序中):

int difference = e.NewValue - e.OldValue;
if (e.Type == ScrollEventType.SmallIncrement)
{
    if (difference != scrollBar.SmallChange)
    {
        int increase = (scrollBar.SmallChange - difference);
        scrollBar.Maximum += increase;
        scrollBar.Value += increase;
    }
}

在调试器中查看它,这完全符合我的预期。但是,函数结束后发生了一些事情(不确定是什么),导致 scrollBar.Value 设置回其原始值加一。如果我按住向下箭头,它几乎可以正常工作。松开按钮后,它仍然会跳回一点。

知道是什么原因造成的,有什么方法可以解决吗?

干杯!

编辑:这是我的滚轮代码。它是如此相似,以至于它为什么不起作用令人困惑。这在包含面板的 MouseWheel 事件处理程序中。

int desiredValue = scrollBar.Value - e.Delta;
scrollBar.MaximumValue = (Math.Max(normalBottom, desiredValue + scrollBar.LargeChange));
scrollBar.Value = Math.Max(0, desiredValue);

normalBottom 是一个变量,用于记住滚动条的“有限”结尾——在 excel 中,这可能是用户输入的最低数据,或者是屏幕的高度;所以它通常会在这个值之上滚动(不会变成负数)。

【问题讨论】:

  • 你为什么使用这个比较:if (difference != scrollBar.SmallChange) ?目的是什么?
  • 如果差值 != SmallChange,则一定意味着我们在可滚动范围内达到了底部。

标签: c# .net scrollbar


【解决方案1】:

您的滚动条发生的情况如下:当用户与滚动条交互导致事件并且您的事件处理程序被调用时,属性值尚未更新,在您的事件处理程序返回后,该属性由内部设置滚动条覆盖您设置的值并导致您提到的“跳回”效果。它如何记住它必须设置的值?简单:它在 e.NewValue 中。这正是您的解决方案,为了能够在滚动事件期间正确更改此属性的最终值,只需按如下方式写入 e.NewValue:

int difference = e.NewValue - e.OldValue;
        if (e.Type == ScrollEventType.SmallIncrement)
        {
            if (difference != scrollBar.SmallChange)
            {
                int increase = (scrollBar.SmallChange - difference);
                scrollBar.Maximum += increase;
                e.NewValue = scrollBar.Value + increase;
            }
        }

我想链接这些可能与您相关的页面: http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx

备注备注(这就是为什么即使移动Maximun你仍然只能前进1):

只能以编程方式达到最大值。滚动条的值无法在运行时通过用户交互达到其最大值。通过用户交互可以达到的最大值等于 1 加上 Maximum 属性值减去 LargeChange 属性值。如有必要,您可以将 Maximum 属性设置为对象的大小 -1 以考虑 1 的项。

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.scroll.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs.newvalue.aspx (获取或设置滚动条的新值。[强调集中])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2016-08-07
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2020-10-14
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多