2

私には2つのフォームがあります。Form2は次のように から開かれていForm1ます:

Form2.ShowDialog();

StartPositionForm2は に設定されていcenterParentます。

Form2Form1 の中心に位置を固定する必要があるため、移動するForm2Form1もその位置を変更します。私は多くの解決策を試しましたが、成功しませんでした。

4

2 に答える 2

4

ShowDialog 関数を呼び出すときに親参照を含める必要がありますが、LocationChanged イベントを使用する前に、最初の位置の差も記録する必要があります。

Form2 f2 = new Form2();
f2.StartPosition = FormStartPosition.CenterParent;
f2.ShowDialog(this);

次に、ダイアログ フォームで、次のように接続できます。

Point parentOffset = Point.Empty;
bool wasShown = false;

public Form2() {
  InitializeComponent();
}

protected override void OnShown(EventArgs e) {
  parentOffset = new Point(this.Left - this.Owner.Left,
                           this.Top - this.Owner.Top);
  wasShown = true;
  base.OnShown(e);
}

protected override void OnLocationChanged(EventArgs e) {
  if (wasShown) {
    this.Owner.Location = new Point(this.Left - parentOffset.X, 
                                    this.Top - parentOffset.Y);
  }
  base.OnLocationChanged(e);
}

このコードはエラー チェックを行っておらず、デモンストレーション コードのみです。

于 2013-02-10T13:48:39.800 に答える
2

これは一般的に非常に望ましくないUI機能であることに注意してください。ダイアログは、アプリの残りのウィンドウを無効にするため、煩わしいものです。これにより、ユーザーはウィンドウをアクティブにしてそのコンテンツを確認できなくなります。ユーザーができることは、ダイアログを邪魔にならないように移動することだけです。あなたは意図的にこれが機能するのを防いでいます。

とにかく、LocationChangedイベントで実装するのは簡単です。次のコードをダイアログフォームクラスに貼り付けます。

    private Point oldLocation = new Point(int.MaxValue, 0);

    protected override void OnLocationChanged(EventArgs e) {
        if (oldLocation.X != int.MaxValue && this.Owner != null) {
            this.Owner.Location = new Point(
                this.Owner.Left + this.Left - oldLocation.X,
                this.Owner.Top + this.Top - oldLocation.Y);
        }
        oldLocation = this.Location;
        base.OnLocationChanged(e);
    }
于 2013-02-10T14:17:38.257 に答える