c# - 父表單 - window form mdi




在C#中以父表單的中心顯示子表單 (10)

“父母”和“所有者”之間似乎存在混淆。 如果您打開一個MDI形式的表單,即嵌入另一個表單內,那麼這個周圍的表單就是Parent。 具有值FormStartPosition.CenterParent的表單屬性StartPosition引用此屬性。 您可以傳遞給Show方法的參數是Owner,而不是Parent! 這就是為什麼frm.StartPosition = FormStartPosition.CenterParent無法正常工作的原因。

如果將其StartPosition設置為Manual,則表單中放置的以下代碼將使其所有者俱有一定的偏移量。 小偏移以平鋪方式打開表單。 如果所有者和擁有的表單具有相同的大小或者您打開多個擁有的表單,則這是一個優勢。

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    if (Owner != null && StartPosition == FormStartPosition.Manual) {
        int offset = Owner.OwnedForms.Length * 38;  // approx. 10mm
        Point p = new Point(Owner.Left + Owner.Width / 2 - Width / 2 + offset, Owner.Top + Owner.Height / 2 - Height / 2 + offset);
        this.Location = p;
    }
}

我創建一個新表單並從父表單調用如下:

loginForm = new SubLogin();   
loginForm.Show();

我需要在父級的中心顯示子表單。 所以,在子表單加載中我做了foll:`

Point p = new Point(this.ParentForm.Width / 2 - this.Width / 2, this.ParentForm.Height / 2 - this.Height / 2);
this.Location = p;

但是,由於父表單為空,因此拋出錯誤。 我也試過設置Parent屬性,但沒有幫助。 有什麼輸入嗎?


你需要這個:

用this.parent替換我,但是在顯示該表單之前需要設置父級。

  Private Sub ÜberToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÜberToolStripMenuItem.Click

        'About.StartPosition = FormStartPosition.Manual ' !!!!!
        About.Location = New Point(Me.Location.X + Me.Width / 2 - About.Width / 2, Me.Location.Y + Me.Height / 2 - About.Height / 2)
        About.Show()
    End Sub

創建一個Windows窗體,然後為它添加選項:CenterParent然後使用此代碼:

yourChildFormName x = new yourChildFormName();
x.ShowDialog();

嘗試:

loginForm.StartPosition = FormStartPosition.CenterParent;
loginForm.ShowDialog(this);

當然,子將for將成為父窗口的阻塞表單(對話框),如果不需要那麼只需將ShowDialog替換為Show ..

loginForm.Show(this);

您仍然需要指定StartPosition。


在SubLogin表單上,我將公開一個SetLocation方法,以便您可以從父表單中設置它:

public class SubLogin : Form
{
   public void SetLocation(Point p)
   {
      this.Location = p;
   }
} 

然後,從您的主要表格:

loginForm = new SubLogin();   
Point p = //do math to get point
loginForm.SetLocation(p);
loginForm.Show();

如果你必須使childForm居中,那麼代碼將是這樣的。 此代碼位於childForm.cs中

this.Show(parent as Form);    // I received the parent object as Object type
this.CenterToParent();

它適用於所有情況,交換Form1作為主表單。

Popup popup = new Popup();
popup.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
popup.Location = new System.Drawing.Point((Form1.ActiveForm.Location.X + Form1.ActiveForm.Width / 2) - (popup.Width / 2),(Form1.ActiveForm.Location.Y + Form1.ActiveForm.Height / 2) - (popup.Height / 2));
popup.Show(Form1.ActiveForm);

您可以在子窗體的構造函數中設置StartPosition,以便窗體的所有新實例都以其父窗口為中心:

public MyForm()
{
    InitializeComponent();

    this.StartPosition = FormStartPosition.CenterParent;
}

當然,您也可以在子窗體的Designer屬性中設置StartPosition屬性。 如果要將子窗體顯示為模式對話框,只需在ShowDialog方法的參數中設置窗口所有者:

private void buttonShowMyForm_Click(object sender, EventArgs e)
{
    MyForm form = new MyForm();
    form.ShowDialog(this);
}

當您嘗試訪問它時,父級可能尚未設置。

嘗試這個:

loginForm = new SubLogin();
loginForm.Show(this);
loginForm.CenterToParent()

除非我使用form.ShowDialog();否則父設置對我form.ShowDialog();

使用form.Show();form.Show(this); 在我使用之前沒有任何工作, this.CenterToParent(); 。 我只是把它放在表單的Load方法中。 一切都很好。

設置了父級中心的起始位置,並在使用阻止showdialog時起作用。





winforms