Juil 10

Je me suis un peu pris la tête hier sur un problème apparemment basique : lorsque je définis la propriété StartPosition = CenterParent, lorsque j’exécute l’instruction myForm.Show(), le formulaire ne s’affiche pas centré sur le parent.

C’est assez mineur, mais c’est plutôt énervant de voir des comportements inattendus.
Après quelques tests et recherches, j’ai appris ceci :

  • CenterParent, pour une raison étrange et inconnue ne fonctionne pas pour les formulaires non modaux (ouverts avec myForm.Show()) mais fonctionne parfaitement avec les formulaires modaux (ouverts avec myForm.ShowDialog()).
  • Je n’y avais pas pensé, mais cela paraît évident une fois qu’on le sait : pour pouvoir centrer sur le formulaire parent, il faut quand même que le formulaire sache qui est son parent. Pour cela, il faut utiliser la propriété Owner du formulaire.
    Les méthodes Show() et ShowDialog() ont toutes les deux une surcharge permettant de fournir en paramètre d’entrée le parent. Mais visiblement CenterParent ne marche pas mieux si l’on utilise cette surcharge.

La seule solution que j’ai trouvé, c’est de m’occuper moi-même du centrage du formulaire. Alors bon, en fait c’est beaucoup plus simple que ce que je pensais, il suffit de profiter d’une magnifique méthode que le framework semble oublier d’utiliser :

Form.CenterToParent()

Donc plusieurs solutions possibles :

  • Ajouter le paramètre Owner dans le constructeur, ce qui permet d’affecter cette valeur à le propriété du même nom, puis appeler CenterToParent()
  • Gérer l’évènement Shown ou Load du formulaire et dans cette méthode, appeler CenterToParent(). Cela ne fonctionne bien entendu que si la propriété Owner a été définie préalablement : soit directement (dans le code du parent : myForm.Owner = this) ou via la surcharge de Show() (dans le code du parent : myForm.Show(this)).

Personnellement j’ai choisi la deuxième solution.

Leave a Reply