[WinForm] C#避免Panel(ScrollableControl)的子控件獲取焦點時滾動條自動滾動
重現
1.Panel設置AutoScroll=True。
2.在Panel內放置控件,比如文本框、ListBox,讓其出現滾動條。
3.在選中子控件(子控件獲得焦點)時,滾動條可能會自動滾動。
解決
試過在子控件的Enter事件里獲取滾動條的位置,然后在MouseDown事件里將滾動后的滾動條再復位,不過感覺效果不行。
然后找了一篇:See Win App: Is your AutoScroll too auto?,蛋疼的是無法訪問。不過還好有人把關鍵代碼放出來了。
/// <summary>
/// 定義自動滾動定位委托
/// </summary>
/// <param name="ctrl">指定的自動滾動定位的控件</param>
/// <param name="p">指定的自動滾動定位的位置</param>
protected delegate void AutoScrollPositionDelegate(ScrollableControl ctrl, Point p);
private void TextBox1_Enter(EventArgs e)
{
if (Parent is Panel)
{
Point p = (this.Parent as Panel).AutoScrollPosition;
AutoScrollPositionDelegate del = new AutoScrollPositionDelegate(SetAutoScrollPosition);
Object[] args = { this.Parent as Panel, p};
BeginInvoke(del, args);
}
}
/// <summary>
/// 設置指定的可滾動控件的自動滾動定位的位置。
/// </summary>
/// <param name="sender"></param>
/// <param name="p"></param>
private void SetAutoScrollPosition(ScrollableControl sender, Point p)
{
p.X = Math.Abs(p.X);
p.Y = Math.Abs(p.Y);
sender.AutoScrollPosition = p;
}
Panel.AutoScrollPosition:獲取或設置自動滾動定位的位置。需注意,設置的時候X,Y得為正數;獲取的卻是負數。

浙公網安備 33010602011771號