web-dev-qa-db-ja.com

非モーダルフォームをCenterParentする方法

親フォームから開く非モーダルの子フォームがあります。子フォームを親フォームの中央に配置する必要があります。子フォームのプロパティをCenterParentに設定し、これを試しました。

Form2 f = new Form2();
f.Show(this);

しかし、役に立たない。これはモーダルフォームでは機能しますが、非モーダルフォームでは機能しません。簡単な解決策はありますか、それともその位置を中心に固定するためにすべての数学計算を行う必要がありますか?

22
nawfal

私は怖いです 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);
58
Rotem

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();
11
Joe

モードレスフォームの場合、これが解決策です。

親フォームの中央にモードレスダイアログを表示する場合は、子フォームのStartPositionFormStartPosition.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;

StartPositionFormStartPosition.Manualに設定されていると、子フォームの一部が表示されないという問題が発生します。

これを解決するには、子フォームのLocalizableプロパティをtrueに設定する必要があります。

4
prmsmp
Form2 f = new Form2();
f.StartPosition = FormStartPosition.CenterParent;
f.Show(this);
3
Daniel A. White