在下面的代码中,仅第二种方法对我有效(.NET 4.0)。 FormStartPosition.CenterParent不会将子窗体置于其父窗体的中心。
为什么?

资料来源:this SO question

using System;
using System.Drawing;
using System.Windows.Forms;

class Program
{
  private static Form f1;

  public static void Main()
  {
    f1 = new Form() { Width = 640, Height = 480 };
    f1.MouseClick += f1_MouseClick;
    Application.Run(f1);
  }

  static void f1_MouseClick(object sender, MouseEventArgs e)
  {
    Form f2 = new Form() { Width = 400, Height = 300 };
    switch (e.Button)
    {
      case MouseButtons.Left:
      {
        // 1st method
        f2.StartPosition = FormStartPosition.CenterParent;
        break;
      }
      case MouseButtons.Right:
      {
        // 2nd method
        f2.StartPosition = FormStartPosition.Manual;
        f2.Location = new Point(
          f1.Location.X + (f1.Width - f2.Width) / 2,
          f1.Location.Y + (f1.Height - f2.Height) / 2
        );
        break;
      }
    }
    f2.Show(f1);
  }
}

最佳答案

这是因为您没有告诉f2谁是Parent

如果这是MDI应用程序,则f2应该将其MdiParent设置为f1

Form f2 = new Form() { Width = 400, Height = 300 };
f2.StartPosition = FormStartPosition.CenterParent;
f2.MdiParent = f1;
f2.Show();

如果这不是MDI应用程序,则需要使用ShowDialog作为参数来调用f1方法。
Form f2 = new Form() { Width = 400, Height = 300 };
f2.StartPosition = FormStartPosition.CenterParent;
f2.ShowDialog(f1);

请注意,由于无法设置CenterParent,因此Show无法与Parent一起正常使用,因此,如果ShowDialog不适当,则手动方法是唯一可行的方法。

09-20 21:05