ScrollBar值设置不正确

我正在尝试实现类似于Excel的“无限”可滚动性的东西; 用户可以滚动到文档的“底部”; 但随后继续滚动(使用滚动条或滚动条上的向下箭头),还有更多,为它们生成空行。 我有这个大多数工作(当使用鼠标滚轮它完美地工作); 但我在使用SmallIncrementfunction时遇到了麻烦 – 就是这样; 当用户单击滚动条上的向下箭头时,它应该通过scrollbar.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中,这可能是用户输入的最低数据,也可能是屏幕的高度; 所以它正常滚动到这个值之上(不会变为负数)。

滚动条发生的情况如下:当用户与滚动条交互导致事件并且调用事件处理程序时,属性值尚未更新,在事件处理程序返回后,属性由滚动条在内部设置覆盖您设置的值并导致您提及的“跳回”效果。 它如何记住它必须设置的值? 容易:它在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加上最大属性值减去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 (获取或设置滚动条的新值。[集中强调])