【发布时间】: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,则一定意味着我们在可滚动范围内达到了底部。