天天看點

[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得為正數;擷取的卻是負數。

轉載于:https://www.cnblogs.com/ainijiutian/archive/2011/12/23/2299172.html

c#