私には2つのフォームがあります。Form2
は次のように から開かれていForm1
ます:
Form2.ShowDialog();
StartPosition
のForm2
は に設定されていcenterParent
ます。
Form2
Form1 の中心に位置を固定する必要があるため、移動するForm2
とForm1
もその位置を変更します。私は多くの解決策を試しましたが、成功しませんでした。
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);
}
このコードはエラー チェックを行っておらず、デモンストレーション コードのみです。
これは一般的に非常に望ましくない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);
}