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?
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.
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.
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.
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();
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
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();
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);
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.
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);
}
Das übergeordnete Element ist wahrscheinlich noch nicht festgelegt, wenn Sie versuchen, darauf zuzugreifen.
Versuche dies:
loginForm = new SubLogin();
loginForm.Show(this);
loginForm.CenterToParent()
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();
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();
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".
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();
}
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.