webentwicklung-frage-antwort-db.com.de

Zeige ein untergeordnetes Formular in der Mitte des übergeordneten Formulars in C #

Ich erstelle ein neues Formular und rufe vom übergeordneten Formular aus folgendermaßen auf: 

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

Ich muss das untergeordnete Formular in der Mitte des übergeordneten Elements anzeigen. Also mache ich in der untergeordneten Formularlade folgendes: `

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, half aber nicht. Irgendwelche Eingaben dazu?

65
Newbiee

Versuchen:

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

Natürlich ist das untergeordnete Element nun ein blockierendes Formular (Dialog) des übergeordneten Fensters. Wenn dies nicht gewünscht ist, ersetzen Sie einfach ShowDialog durch Show ..

loginForm.Show(this);

Sie müssen dennoch die StartPosition angeben.

122

Es scheint eine Verwirrung zwischen "Eltern" und "Eigentümer" zu geben. Wenn Sie ein Formular als MDI-Formular öffnen, d. H. Eingebettet in ein anderes Formular, ist dieses umgebende Formular das übergeordnete Element. Die Formulareigenschaft StartPosition mit dem Wert FormStartPosition.CenterParent verweist auf diesen. Der Parameter, den Sie an die Show-Methode übergeben können, ist der Eigentümer und nicht der übergeordnete Teil! Deshalb funktioniert frm.StartPosition = FormStartPosition.CenterParent nicht wie erwartet.

Der folgende Code, der in einem Formular platziert wird, zentriert es in Bezug auf seinen Besitzer mit einem gewissen Versatz, wenn seine Startposition auf Manuell gesetzt ist. Der kleine Versatz öffnet die Formulare kachelförmig. Dies ist von Vorteil, wenn der Besitzer und das Besitzerformular dieselbe Größe haben oder wenn Sie mehrere Besitzerformulare ö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;
    }
}

Angenommen, Ihr Code läuft in Ihrem übergeordneten Formular, dann suchen Sie wahrscheinlich nach etwas wie diesem:

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

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

10

Die Einstellung des übergeordneten Elements funktioniert nicht für mich, wenn ich nicht form.ShowDialog(); verwende.

Bei der Verwendung von form.Show(); oder form.Show(this); hat nichts funktioniert, bis ich this.CenterToParent(); verwendet habe. Ich stelle das einfach in die Load - Methode des Formulars. Alles ist gut.

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

8
Highflier

Wenn Sie ein Formular in einem MDIForm-Formular starten, müssen Sie .CenterScreen anstelle von .CenterParent verwenden.

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

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
4
Stefan Steiger
childform = new Child();
childform.Show(this);

Im Fall der Childform laden

this.CenterToParent();

Im SubLogin-Formular würde ich eine SetLocation-Methode verfügbar machen, damit Sie sie aus Ihrem übergeordneten Formular festlegen können:

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

Dann von Ihrem Hauptformular aus:

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

Es funktioniert in allen Fällen, Form1 für Ihr Hauptformular zu tauschen.

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

Wenn Sie Ihren eigenen Standort berechnen möchten, setzen Sie zuerst StartPosition auf 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-/übergeordnete Formular ist, genau wie Location.X.

Der Standardwert für StartPosition ist FormStartPosition.CenterParent und ändert daher den Ort des Kindes nach der Anzeige.

1
Lex van Buiten

Sie können 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;
}

Sie können natürlich auch die StartPosition-Eigenschaft in den Designer-Eigenschaften für Ihr untergeordnetes Formular festlegen. Wenn Sie das untergeordnete Formular als modales Dialogfeld anzeigen möchten, legen Sie 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
iCode

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

Versuche dies:

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

Erstellen Sie ein Windows-Formular und setzen Sie dann eine Option dafür: CenterParent verwenden Sie dann diesen Code:

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

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

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

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 Sie die Position des Unterfensters manuell mit festlegen Mit Hilfe der X- und Y-Koordinaten.

Ändern Sie in den Eigenschaften des Unterfensters die "StartPosition" in "Manuell".

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 zur Definition 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 Mittelpunkts des Elternteils berechnet, und das Unterfenster wird genau im Zentrum des Elternteils gehalten, indem der eigene Mittelpunkt um (this.height/2) und (this.width/2) dieser Funktion berechnet wird auch für von Eltern verlegte Ereignisse übernommen.

0
Garuda Prasad K