我在继承自ScrollableControl
的C#中编写图像查看器控件。它允许缩放和平移图像上的视图,并具有反映可见图像区域的滚动条。
我使用了集成的HorizontalScroll
和VerticalScroll
,可以实现更新它们以按预期显示(设置Visible
,Maximum
,LargeChange
并且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;显示的内容:
我多次检查过我的代码在滚动时是否以某种方式意外地操纵Value
,但我从未错误地设置该属性。
我还尝试在OnScroll
中手动设置ScrollBar值,但它没有帮助。
如何正确地将拇指放在适当的位置,我需要做什么?我做错了什么?