1

AutoScrolltrueに設定されたフォームがあります。フォームの開始時にフォームの一部のコントロールは表示されませんが、それらの場所はすでに設定されています。コントロールが表示されるようになると、現在の位置を基準にして位置が計算されますがAutoScrollPosition、これはまったく不要です。

これを防ぐ方法はありますか?

コントロールが最初に表示されたときの位置を次のように設定してみました。

 void OnControlVisibleChanged(object sender, EventArgs e)
    {
        Control ctl = (Control)sender;
        if (ctl.Visible)
        {
            ctl.Location = Point.Add(ctl.Location, new Size(this.AutoScrollPosition));
            ctl.VisibleChanged -= OnControlVisibleChanged;
        }
    }

一部のコントロールでは機能しますが、機能しないものもあります。どうしてか分かりません。
編集:コントロールが表示されると、実際のAutoScrollPositionが変更されるようですが、AutoScrollPositionプロパティはすぐには更新されません。

4

1 に答える 1

1

AutoSize = Trueコードに干渉しているようです。それが唯一の障害点であるかどうかはわかりませんが、これは私のテストでは機能しました。

void OnControlVisibleChanged(object sender, EventArgs e) {
  Control ctl = (Control)sender;
  if (ctl.Visible) {
    bool moveOK = true;
    if (ctl.GetType().GetProperty("AutoSize") != null) {
      if ((bool)ctl.GetType().GetProperty("AutoSize").GetValue(ctl, null)) {
        moveOK = false;
      }
    }
    if (moveOK) {
      ctl.Location = Point.Add(ctl.Location, new Size(this.AutoScrollPosition));
    }
  }
}
于 2012-10-31T15:50:46.160 に答える