我正在尝试实现类似于 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被设置回其原始值加一。如果我按住向下箭头,它基本上可以正常工作。一旦释放按钮,它仍然会跳回一点。
知道是什么原因造成的,以及有什么解决方法吗?
Cheers!
Edit:这是我的滚轮代码。它是如此相似,以至于令人困惑为什么它不起作用。这是包含面板中的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 http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx
备注中的注释(这就是为什么即使移动最大值,您仍然只能提前 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.scrollbar.scroll.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs.newvalue.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs.newvalue.aspx(获取或设置滚动条的新值。[集中强调])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)