Emplacement du formulaire lors de l’appel de Form.Show ()

J’essaie de définir l’emplacement d’un formulaire lorsque vous l’appelez par .Show() . Le problème est que parce que j’utilise .Show au lieu de .ShowDialog la valeur StartPosition ne fonctionne pas. Je ne peux pas utiliser le .Showdialog car je veux que le programme fonctionne en arrière-plan tout en affichant le formulaire.

Lorsque je crée le formulaire, je lui atsortingbue une valeur fixe:

 using (ConnectingForm CF = new ConnectingForm()) { CF.Show(); CF.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2); } 

Mais lorsque je lance le code, le formulaire se positionne sur différentes positions chaque fois que je le lance.

Des solutions? (L’emplacement n’est jamais placé ailleurs par mon code)

StartPosition devrait fonctionner Form.Show avec Form.Show . Essayer:

 ConnectingForm CF = new ConnectingForm(); CF.StartPosition = FormStartPosition.CenterParent; CF.Show(this); 

Si vous souhaitez placer manuellement le formulaire, comme vous l’avez montré, vous pouvez également le faire, mais vous devez toujours définir la propriété StartPosition sur Manual :

 ConnectingForm CF = new ConnectingForm(); CF.StartPosition = FormStartPosition.Manual; CF.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2); CF.Show(); 

Sur une note de côté, vous ne devez pas utiliser une instruction using avec Form.Show . using appellera Dispose sur le formulaire, ce qui n’est pas souhaitable, car la durée de vie du formulaire est plus longue que ce bloc de code.

Avec l’aide d’autres threads, j’ai trouvé une solution de travail:

  using (ConnectingForm CF = new ConnectingForm()) { CF.StartPosition = FormStartPosition.Manual; CF.Show(this); ...... } 

Sur l’événement de chargement du nouveau formulaire:

  private void ConnectingForm_Load(object sender, EventArgs e) { this.Location = this.Owner.Location; this.Left += this.Owner.ClientSize.Width / 2 - this.Width / 2; this.Top += this.Owner.ClientSize.Height / 2 - this.Height / 2; } 

(Je ne suis pas expert donc corrigez-moi si je me trompe) Voici comment j’interprète le problème et la solution: Le problème dès le début était que la position de démarrage du premier formulaire (MainForm) était définie sur Windows Default Location qui varie lorsque vous démarrez le formulaire. Lorsque j’ai ensuite appelé le nouveau formulaire (formulaire de connexion), son emplacement n’était pas relatif à l’emplacement de son parent, mais à l’emplacement (0, 0) (coin supérieur gauche de l’écran). Donc, ce que je voyais, c’était le changement de position de MainForms, qui donnait l’impression que la position de Connecting Form était en mouvement. La solution à ce problème était donc de définir d’abord l’emplacement du nouveau formulaire sur l’emplacement du formulaire principal. Après cela, j’ai pu définir l’emplacement comme centre du formulaire principal.

TL; DR l’emplacement du nouveau formulaire n’était pas relatif à l’emplacement du formulaire parent, mais à une position fixe que je devine (0, 0)

J’ai changé la position de démarrage du MainForm à un niveau fixe pour ma propre commodité. J’ai également ajouté un événement pour s’assurer que la nouvelle position des formulaires était toujours au centre du MainForm.

  private void Location_Changed(object sender, EventArgs e) { this.Location = this.Owner.Location; this.Left += this.Owner.ClientSize.Width / 2 - this.Width / 2; this.Top += this.Owner.ClientSize.Height / 2 - this.Height / 2; } private void ConnectingForm_Load(object sender, EventArgs e) { this.Owner.LocationChanged += new EventHandler(this.Location_Changed); this.Location = this.Owner.Location; this.Left += this.Owner.ClientSize.Width / 2 - this.Width / 2; this.Top += this.Owner.ClientSize.Height / 2 - this.Height / 2; } 

J’espère que cela aidera les autres avec le même problème!