Panelの子を選択した時の自動スクロールを無効にする

Panel.AutoScrollがtrueの時に子コントロールにフォーカスが移動すると自動的にそのコントロールの表示位置までスクロールしてしまいます。
これはこれで便利なのですが、子コントロールをマウスで動かしたりするようなものを作る場合には邪魔になります。というかなりました。


で、無効にすべく色々やってみたところ次のようにするとうまくいくようです。(.NET 2.0以上)

public class CustomPanel : Panel {
    private bool _AutoScrollControlIntoView;
    public bool AutoScrollControlIntoView {
        get {
            return this._AutoScrollControlIntoView;
        }
        set {
            this._AutoScrollControlIntoView = value;
        }
    }

    protected override Point ScrollToControl(Control activeControl) {
        if (this.AutoScrollControlIntoView) {
            return base.ScrollToControl(activeControl);
        } else {
            return new Point(-this.HorizontalScroll.Value, -this.VerticalScroll.Value);
        }            
    }
}

Panelを継承してScrollToControlをオーバーライドし、戻り値を現在のスクロールバーの値 * -1にします。


弊害としてPanel.ScrollControlIntoViewが動かなくなりますが、ScrollControlIntoViewの呼び出し前後でAutoScrollControlIntoViewを切り替えるようにして回避します。