需求及问题
昨天有个需求,解决C#Panel滚动条在子控件点击或刷新自动变化位置的问题,经过看到有客友说重写Panel的 ScrollToControl 函数如
protected override System.Drawing.Point ScrollToControl(Control activeControl)
{
return this.AutoScrollPosition;
}
调试
我尝试后发现没有作用,不知道问题点出在哪里。
经过一番调试,总的就是返回 AutoScrollPosition 值。
只需要在点击前获取 AutoScrollPosition 值,记录此时的 AutoScrollPosition 为一个 Point Pos点;
当退出时,再重新赋值给 AutoScrollPosition ,可保当前位置滚动条位置不变。
逻辑很清晰也很合理,接着问题来了,无论我怎么操作 AutoScrollPosition = Pos的时候,
AutoScrollPosition 的属性 IsEmpty 总为 true,X、Y 值,检查 Pos 的坐标没有错。
再经过一番查找,才发现问题出在 坐标符号上。
Panel滚动条的左上角为(0, 0),越往右下数值变大,而符号为负,即(-X, -Y);
这也是 AutoScrollPosition 的坐标属性。
原因
当pos = AutoScrollPosition 时,Pos的值也带 - 符号,例如 pos = (-100, -100);
当再把值返还给 AutoScrollPosition 时,却不是 AutoScrollPosition = pos ;
而是 AutoScrollPosition = new point(-pos.X, -Pos.Y) 的类似操作,此时的前提是滚动条左上为0,右下为负。当然也可以直接取 Pos的绝对值。
结论:
AutoScrollPosition 赋值对于正数是直接转换为自己的坐标,对于直接传入的负坐标,赋值就失败。即 AutoScrollPosition = new point(X的绝对值,Y的绝对值);