用户滚动后,ScrollableControl重置ScrollBar Value

时间:2017-08-06 11:26:00

标签: c# winforms scrollbar scrollbars

我在继承自ScrollableControl的C#中编写图像查看器控件。它允许缩放和平移图像上的视图,并具有反映可见图像区域的滚动条。

我使用了集成的HorizontalScrollVerticalScroll,可以实现更新它们以按预期显示(设置VisibleMaximumLargeChange并且Value最突出):

SizeF viewSize = new SizeF(ClientSize.Width / Zoom, ClientSize.Height / Zoom);
SizeF freeTopLeft = new SizeF(-_offset.X, -_offset.Y);
SizeF freeBotRight = new SizeF(
    viewSize.Width - ImageSize.Width - freeTopLeft.Width,
    viewSize.Height - ImageSize.Height - freeTopLeft.Height);
// Horizontal
if (freeTopLeft.Width < 0 || freeBotRight.Width < 0)
{
    HorizontalScroll.Visible = true;
    HorizontalScroll.Maximum = (int)ImageSize.Width;
    HorizontalScroll.LargeChange = (int)viewSize.Width;
    HorizontalScroll.Value = (int)-freeTopLeft.Width;
}
else
{
    HorizontalScroll.Visible = false;
}
// Vertical same as horizontal using Height, removed for brevity.

当用户拖动滚动条拇指时,我会在OnScroll(ScrollEventArgs se)中正确更新图像的显示部分:

switch (se.ScrollOrientation)
{
    case ScrollOrientation.HorizontalScroll:
        _offset.X = se.NewValue;
        break;
    case ScrollOrientation.VerticalScroll:
        _offset.Y = se.NewValue;
        break;
}
Refresh();

但是,只要用户松开鼠标按钮,他就会拖动拇指,两个滚动条都会跳回Value 0.它不会再创建另一个OnScroll事件,所以我的图像仍会显示预期的部分,但滚动条&#34; desynced&#34;显示的内容: Scroll bar thumb jumping back

我多次检查过我的代码在滚动时是否以某种方式意外地操纵Value,但我从未错误地设置该属性。 我还尝试在OnScroll中手动设置ScrollBar值,但它没有帮助。

如何正确地将拇指放在适当的位置,我需要做什么?我做错了什么?

0 个答案:

没有答案