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?
Die Einstellung des Elternteils funktioniert bei mir nur, wenn ich sie verwende
form.ShowDialog();
.Bei der Verwendung
form.Show();
oderform.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.
quelle
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; } }
quelle
CenterParent
auch relativ zu funktioniertOwner
, zumindest mit der Version von .net, die ich verwende.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.quelle
Wenn Sie ein Formular innerhalb eines
MDIForm
Formulars starten, müssen Sie es.CenterScreen
anstelle von verwenden.CenterParent
.FrmLogin f = new FrmLogin(); f.MdiParent = this; f.StartPosition = FormStartPosition.CenterScreen; f.Show();
quelle
childform = new Child(); childform.Show(this);
Im Falle des Ladens der Kinderform
this.CenterToParent();
quelle
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
quelle
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);
quelle
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();
quelle
Wenn Sie Ihren eigenen Standort berechnen, dann zuerst eingestellt
StartPosition
aufFormStartPosition.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
StartPosition
istFormStartPosition.CenterParent
und ändert daher den Standort des Kindes nach dem Anzeigen.quelle
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));
quelle
Erstellen Sie ein Windows Form und geben Sie die Option ein: CenterParent und verwenden Sie diesen Code:
yourChildFormName x = new yourChildFormName(); x.ShowDialog();
quelle
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); }
quelle
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.
quelle
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)
quelle
Das übergeordnete Element ist wahrscheinlich noch nicht festgelegt, wenn Sie versuchen, darauf zuzugreifen.
Versuche dies:
loginForm = new SubLogin(); loginForm.Show(this); loginForm.CenterToParent()
quelle
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();
quelle
protected override void OnLoad(EventArgs e) { base.OnLoad(e); CenterToParent(); }
quelle
Warum nicht nutzen?
(vb.net)
quelle