親フォームから開く非モーダルの子フォームがあります。子フォームを親フォームの中央に配置する必要があります。子フォームのプロパティをCenterParent
に設定し、これを試しました。
Form2 f = new Form2();
f.Show(this);
しかし、役に立たない。これはモーダルフォームでは機能しますが、非モーダルフォームでは機能しません。簡単な解決策はありますか、それともその位置を中心に固定するためにすべての数学計算を行う必要がありますか?
私は怖いです StartPosition.CenterParent
はモーダルダイアログにのみ適しています(.ShowDialog
)。
場所を次のように手動で設定する必要があります。
Form f2 = new Form();
f2.StartPosition = FormStartPosition.Manual;
f2.Location = new Point(this.Location.X + (this.Width - f2.Width) / 2, this.Location.Y + (this.Height - f2.Height) / 2);
f2.Show(this);
Show(this)がShowDialog(this)w.r.tフォームのセンタリングと同じように動作しないのは本当に奇妙に思えます。私が提供しなければならないのは、ハッキーな回避策を隠すためのきちんとした方法でのRotemのソリューションです。
拡張クラスを作成します。
public static class Extension
{
public static Form CenterForm(this Form child, Form parent)
{
child.StartPosition = FormStartPosition.Manual;
child.Location = new Point(parent.Location.X + (parent.Width - child.Width) / 2, parent.Location.Y + (parent.Height - child.Height) / 2);
return child;
}
}
最小限の手間でそれを呼び出します:
var form = new Form();
form.CenterForm(this).Show();
モードレスフォームの場合、これが解決策です。
親フォームの中央にモードレスダイアログを表示する場合は、子フォームのStartPosition
をFormStartPosition.Manual
に設定する必要があります。
form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(parent.Location.X + (parent.Width - form.Width) / 2, parent.Location.Y + (parent.Height - form.Height) / 2);
form.Show(parent);
.NET Framework4.0の場合-次のように子フォームのControlBoxプロパティをfalse
に設定し、FormBorderStyle
プロパティをNotSizable
に設定した場合:
form.ControlBox = false;
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
StartPosition
がFormStartPosition.Manual
に設定されていると、子フォームの一部が表示されないという問題が発生します。
これを解決するには、子フォームのLocalizable
プロパティをtrue
に設定する必要があります。
Form2 f = new Form2();
f.StartPosition = FormStartPosition.CenterParent;
f.Show(this);