我正在尝试实现类似于Excel的“无限”可滚动性的东西;用户可以滚动到文档的“底部”;但随后继续滚动(使用滚动条或滚动条上的向下箭头),还有更多,为它们生成空行。我有这个大多数工作(当使用鼠标滚轮它完美地工作);但我在使用SmallIncrement功能时遇到了麻烦 - 就是这样;当用户单击滚动条上的向下箭头时,它应该通过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中,这可能是用户输入的最低数据,也可能是屏幕的高度;所以它正常滚动到这个值之上(不会变为负数)。
答案 0 :(得分:5)
滚动条发生的情况如下:当用户与滚动条交互导致事件并调用事件处理程序时,属性值尚未更新,在事件处理程序返回后,属性由内部设置由滚动条覆盖您设置的值并导致您提及的“跳回”效果。它如何记住它必须设置的值?容易:它在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 (获取或设置滚动条的新值。[集合中的强调])