FormStartPosition.CenterParent does not work

前端 未结 13 908
独厮守ぢ
独厮守ぢ 2021-01-01 08:57

In the following code, only the second method works for me (.NET 4.0). FormStartPosition.CenterParent does not center the child form over its parent. Why?

相关标签:
13条回答
  • 2021-01-01 09:37

    Using

    form.Show(this);
    

    throws an exception if you call it a second time. Manually setting the location seems to be the only reliable option :/ (wasn't it fairly recently that CenterParent used to work?)

    0 讨论(0)
  • 2021-01-01 09:38

    I'm using this code inside my main form, hope it helps:

    var form = new MyForm();
    form.Show();
    if (form.StartPosition == FormStartPosition.CenterParent)
    {
        var x = Location.X + (Width - form.Width) / 2;
        var y = Location.Y + (Height - form.Height) / 2;
        form.Location = new Point(Math.Max(x, 0), Math.Max(y, 0));
    }
    
    0 讨论(0)
  • 2021-01-01 09:38

    I realize this is an old question, but I was recently having the same problem and for reasons I won't get in to, I did not want to use the form.ShowDialog() method and my application was not an MDI application, therefore the CenterParent method was not having any effect. This is how I solved the problem, by computing the coordinates for the form that I wanted centered and triggering the new location in the main form's LocationChanged event. Hopefully this will help someone else having this problem.

    In the example below, the parent form is called MainForm and the form I want centered in MainForm is called pleaseWaitForm.

    private void MainForm_LocationChanged(object sender, EventArgs e)
        {
            Point mainFormCoords = this.Location;
            int mainFormWidth = this.Size.Width;
            int mainFormHeight = this.Size.Height;
            Point mainFormCenter = new Point();
            mainFormCenter.X = mainFormCoords.X + (mainFormWidth / 2);
            mainFormCenter.Y = mainFormCoords.Y + (mainFormHeight / 2);
            Point waitFormLocation = new Point();
            waitFormLocation.X = mainFormCenter.X - (pleaseWaitForm.Width / 2);
            waitFormLocation.Y = mainFormCenter.Y - (pleaseWaitForm.Height / 2);
            pleaseWaitForm.StartPosition = FormStartPosition.Manual;
            pleaseWaitForm.Location = waitFormLocation;           
        } 
    

    If you have a resizable parent form and you wanted your sub form to also be centered whenever the main form is resized, you should, in theory, be able to place this code in a method and then call the method on both the LocationChanged and SizeChanged events.

    0 讨论(0)
  • 2021-01-01 09:42

    Maybe this can help somebody.

    Form frmMessage = new Form();
    

    From experience, although they look similar, they behave different:

    This variant doesn't work:

    if (frmMessage.Parent != null)
        frmMessage.CenterToParent();
    else
        frmMessage.CenterToScreen();
    

    And this variant works

    if (frmMessage.Parent != null)
        frmMessage.StartPosition = FormStartPosition.CenterParent;
    else
        frmMessage.StartPosition = FormStartPosition.CenterScreen;
    
    0 讨论(0)
  • 2021-01-01 09:43

    This is because you are not telling f2 who its Parent is.

    If this is an MDI application, then f2 should have its MdiParent set to f1.

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

    If this is not an MDI application, then you need to call the ShowDialog method using f1 as the parameter.

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

    Note that CenterParent does not work correctly with Show since there is no way to set the Parent, so if ShowDialog is not appropriate, the manual approach is the only viable one.

    0 讨论(0)
  • 2021-01-01 09:43

    I had the same problem, I eventually went with this:

    protected override void OnActivated(EventArgs e) {
        if(this.Modal == false && this.StartPosition == FormStartPosition.CenterParent) {
            if(!(this.Owner is Form)) {
                // Center to the last form opened before this one
                int numforms = Application.OpenForms.Count;
                this.Owner = Application.OpenForms[numforms - 2];
            }
            this.CenterToParent();
            Application.DoEvents();
        }
        base.OnActivated(e);
    }
    

    Used as:

    MyForm form = new MyForm();
    form.Show(this); // with or without
    

    The main advantage is that it does what your colleagues expect it to do, without requiring any hack in the calling form.

    0 讨论(0)
提交回复
热议问题