2011-12-19 3 views
21

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

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

が、無駄にします。これはモーダルフォームでは機能しますが、非モーダルフォームでは機能しません。任意の単純な解法、またはその位置を中心に固定するためにすべての数学的計算を行う必要がありますか?

+1

あなたは 'StartPosition'プロパティを設定しようとしましたか? –

+0

私も試してみましたが、私はあまりにも言及した..それは本当に非モーダルダイアログのwinformsで動作しません..ダンノーなぜそれは.. – nawfal

+0

あなたはプロパティを設定しますか? –

答えて

51

私はStartPosition.CenterParentがモーダルダイアログ(.ShowDialog)のための唯一の良い怖いです。
次のような場所を手動で設定する必要があります:それはショー(これは)フォームセンタリングw.r.tに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); 
+0

+1このようなあなたの迅速な答えのために、私はより単純な方法で私が望んでいたものを持っていた。 – nawfal

+1

+1これは動作し、もう一つは、少なくとも私のためにはありません。 – kol

+1

もう1つの答えがもう私のために働いていないので、答えとして – nawfal

3
Form2 f = new Form2(); 
f.StartPosition = FormStartPosition.CenterParent; 
f.Show(this); 
+0

あなたはなぜそれがこの方法?子フォームのコンストラクタからcenterParentプロパティを設定するときには使用できません。 – nawfal

+0

いいえ、ごめんなさい。 –

+5

奇妙な...これは**私のために**動作しません... – kol

9

。私が提供しなければならないのは、ハッピーな回避策を隠すためのロートムのソリューションです。

が拡張クラスを作成します。

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(); 
3

を、これが解決策です。

親フォームの中央にモードレスダイアログを表示する場合は、子フォームのStartPositionFormStartPosition.Manualに設定する必要があります。 .NET Frameworkの4.0では

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); 

- あなたは以下のようにNotSizableにプロパティをfalseに子フォームのControlBoxプロパティを設定し、FormBorderStyle場合:

form.ControlBox = false; 
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 

あなたは子供の一部はdoesnのを形成する問題に直面するだろうStartPositionFormStartPosition.Manualに設定されている場合は表示されません。

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

+1

ありがとうございます。フォームのローカライズ可能なプロパティに関するあなたのコメントは、私のポップアップフォームが少し小さすぎる顧客のシステムでは、年齢の間に私を悩ませていた問題を修正しました。マイクロソフトではあまりよく説明されていません。なぜそれが動作するのか、そしてLocalizableが間違っているときに何が起こっているのか理解していますか?それを説明する良いリンクを知っていますか?再度、感謝します。 – Erik

関連する問題