Zeigen Sie ein untergeordnetes Formular in der Mitte des übergeordneten Formulars in C # an


75

Ich erstelle ein neues Formular und rufe vom übergeordneten Formular aus wie folgt auf:

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

Ich muss das untergeordnete Formular in der Mitte des übergeordneten Formulars anzeigen. Also mache ich in der untergeordneten Form das Folgende: `

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

Dies ist jedoch ein Fehler, da das übergeordnete Formular null ist. Ich habe auch versucht, die Parent-Eigenschaft festzulegen, aber es hat nicht geholfen. Irgendwelche Eingaben dazu?

Antworten:


133

Versuchen:

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

Das Kindes Kurs wird nun eine blockierende Form (Dialog) des übergeordneten Fensters sein, wenn das nicht dann nur gewünscht wird , ersetzen ShowDialogmit Show..

loginForm.Show(this);

Sie müssen jedoch weiterhin die Startposition angeben.


16
Sie können diese Eigenschaft der LoginForm auch im Designer festlegen.
Tim Hoolihan

53
loginForm.StartPosition = FormStartPosition.CenterParent plus loginForm.Show (this); zentriert das Formular nicht.
Pedro77

@ Pedro77 Ich habe eine ähnliche Situation, außer dass ich den Dialog von einem anderen Thread gezeigt habe, sodass ich "dies" nicht an showDialog übergeben kann. irgendeinen Vorschlag hier?
Anil

1
@ Anil Ich denke, Sie sollten UI-Itens nicht aus einem anderen Thread erstellen. Sie sollten invoke begininvoke für diese Aufgabe verwenden. Schauen Sie sich diese Befehle an.
Pedro77

19

Die Einstellung des Elternteils funktioniert bei mir nur, wenn ich sie verwende form.ShowDialog();.

Bei der Verwendung form.Show(); oder form.Show(this);nichts hat funktioniert, bis ich verwendet habe , this.CenterToParent();. Ich habe das einfach in die Lademethode des Formulars eingefügt . Alles ist gut.

Die Startposition in der Mitte des übergeordneten Elements wurde festgelegt und funktioniert bei Verwendung des blockierenden Showdialogs.


18

Es scheint eine Verwechslung zwischen "Eltern" und "Eigentümer" zu geben. Wenn Sie ein Formular als MDI-Formular öffnen, dh in ein anderes Formular eingebettet sind, ist dieses umgebende Formular das übergeordnete Formular. Die Formulareigenschaft StartPosition mit dem Wert FormStartPosition.CenterParent verweist auf diese. Der Parameter, den Sie an die Show-Methode übergeben können, ist der Eigentümer, nicht der übergeordnete! Aus diesem Grund funktioniert frm.StartPosition = FormStartPosition.CenterParent nicht wie erwartet.

Der folgende Code in einem Formular zentriert ihn in Bezug auf seinen Besitzer mit einem gewissen Versatz, wenn seine Startposition auf Manuell eingestellt ist. Der kleine Versatz öffnet die Formulare gekachelt. Dies ist von Vorteil, wenn der Eigentümer und das eigene Formular dieselbe Größe haben oder wenn Sie mehrere eigene Formulare öffnen.

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

Ich bin mir ziemlich sicher, dass dies CenterParentauch relativ zu funktioniert Owner, zumindest mit der Version von .net, die ich verwende.
Binki

12

Angenommen, Ihr Code wird in Ihrem übergeordneten Formular ausgeführt, dann suchen Sie wahrscheinlich nach etwas Ähnlichem:

loginForm = new SubLogin();
loginForm.StartPosition = FormStartPosition.CenterParent
loginForm.Show(this);

Für die Aufzeichnung gibt es auch eine Form.CenterToParent()Funktion, wenn Sie sie nach der Erstellung aus irgendeinem Grund zentrieren müssen.


9

Wenn Sie ein Formular innerhalb eines MDIFormFormulars starten, müssen Sie es .CenterScreenanstelle von verwenden .CenterParent.

FrmLogin f = new FrmLogin();
f.MdiParent = this;
f.StartPosition = FormStartPosition.CenterScreen;
f.Show();


4

Du brauchst das:

Ersetzen Sie mich durch this.parent, aber Sie müssen das übergeordnete Element festlegen, bevor Sie dieses Formular anzeigen.

  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

3

Es funktioniert in allen Fällen, tauschen Sie Form1 gegen Ihr Hauptformular.

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

2

Auf dem SubLogin-Formular würde ich eine SetLocation-Methode verfügbar machen, damit Sie sie über Ihr übergeordnetes Formular festlegen können:

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

Dann aus Ihrem Hauptformular:

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

2

Wenn Sie Ihren eigenen Standort berechnen, dann zuerst eingestellt StartPositionauf FormStartPosition.Manual:

Form Child = new Form();
Child.StartPosition = FormStartPosition.Manual;
Child.Location = new Point(Location.X + (Width - Child.Width) / 2, Location.Y + (Height - Child.Height) / 2);
Child.Show(this);

Wo dies das Haupt- / Elternformular ist, genau wie bei Location.X.

Der Standardwert für StartPositionist FormStartPosition.CenterParentund ändert daher den Standort des Kindes nach dem Anzeigen.


1

Wenn Sie ein nicht blockierendes Fenster (show () anstelle von showDialog ()) verwenden möchten, funktioniert dies nicht:

//not work with .Show(this) but only with .ShowDialog(this)
loginForm.StartPosition = FormStartPosition.CenterParent;
loginForm.Show(this);

In diesem Fall können Sie diesen Code verwenden, um das untergeordnete Formular zu zentrieren, bevor Sie das Formular anzeigen:

//this = the parent
frmDownloadPercent frm = new frmDownloadPercent();
frm.Show(this); //this = the parent form
//here the tips
frm.Top = this.Top + ((this.Height / 2) - (frm.Height / 2));
frm.Left = this.Left + ((this.Width / 2) - (frm.Width / 2));

0

Erstellen Sie ein Windows Form und geben Sie die Option ein: CenterParent und verwenden Sie diesen Code:

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

0

Sie können die StartPosition im Konstruktor des untergeordneten Formulars festlegen, sodass alle neuen Instanzen des Formulars auf das übergeordnete Formular zentriert werden:

public MyForm()
{
    InitializeComponent();

    this.StartPosition = FormStartPosition.CenterParent;
}

Natürlich können Sie die StartPosition-Eigenschaft auch in den Designer-Eigenschaften für Ihr untergeordnetes Formular festlegen. Wenn Sie das untergeordnete Formular als modales Dialogfeld anzeigen möchten, legen Sie einfach den Fenstereigentümer im Parameter für die ShowDialog-Methode fest:

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

0

Wenn ein Fensterformular (untergeordnetes Formular) aus einem neuen Thread des Hauptfensters (übergeordnetes Formular) geöffnet wurde, ist es nicht möglich, das Unterfenster in der Mitte des Hauptfensters zu halten. Daher müssen wir die Position des Unterfensters manuell durch festlegen Mittelwerte der X- und Y-Koordinaten.

Ändern Sie in den Eigenschaften von Subwindow die "StartPosition" in "Manual".

Code im Hauptfenster

private void SomeFunction()
{
    Thread m_Thread = new Thread(LoadingUIForm);
    m_Thread.Start();
    OtherParallelFunction();
    m_Thread.Abort();
}

private void LoadingUIForm()
{
    m_LoadingWindow = new LoadingForm(this);
    m_LoadingWindow.ShowDialog();
}

Code im Unterfenster zum Definieren der eigenen Position anhand der übergeordneten aktuellen Position sowie der Größe

public LoadingForm(Control m_Parent)
{
   InitializeComponent();
   this.Location = new Point( m_Parent.Location.X+(m_Parent.Size.Width/2)-(this.Size.Width/2),
                              m_Parent.Location.Y+(m_Parent.Size.Height/2)-(this.Size.Height/2)
                            );
}

Hier werden die Koordinaten des Zentrums des Elternteils berechnet, und das Unterfenster wird genau in der Mitte des Elternteils gehalten, indem sein eigenes Zentrum mit (this.height / 2) und (this.width / 2) berechnet wird, die diese Funktion sein kann weiter genommen für Eltern umgesiedelte Ereignisse auch.


0

Als Unterformular denke ich, dass es nicht in der Mitte des übergeordneten Formulars beginnen wird, bis Sie es als Dialog anzeigen. .......... Form2.ShowDialog();

Ich wollte gerade über Form machen. und das ist perfekt, wonach ich suche. und bis Sie das About_Form schließen, können Sie nichts vom übergeordneten Formular berühren / klicken, sobald Sie auf About_Form klicken (in meinem Fall)


-1

Das übergeordnete Element ist wahrscheinlich noch nicht festgelegt, wenn Sie versuchen, darauf zuzugreifen.

Versuche dies:

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

3
CenterToParent ist keine öffentliche Methode. Sie müssen diese Methode als öffentliche Methode von Ihrem Steuerelement delegieren.
Jarek

-1

Wenn Sie Ihre childForm von childForm aus zentrieren müssen, lautet der Code ungefähr so. Dieser Code befindet sich in der Datei childForm.cs

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

-1
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);

        CenterToParent();
    }

-4

Warum nicht nutzen?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.