Si vous modifiez les propriétés RightToLeft, ShowInTaskbar, Form.ShowDialog () se termine de manière inattendue

StackOverflow https://stackoverflow.com/questions/152069

  •  02-07-2019
  •  | 
  •  

Question

La boîte de dialogue se ferme avec le résultat Annuler, sans exception, comme si vous aviez appuyé sur son bouton de fermeture.
Le seul endroit sûr pour définir la propriété RightToLeft est dans le constructeur de formulaire.

Je me suis dit que cette information pourrait faire gagner du temps à quelqu'un d'autre.
Si vous êtes en mesure de développer le problème: s'il existe une confirmation de bogue officielle, quoi d'autre pourrait provoquer la fin inattendue de ShowDialog, s'il vous plaît, faites-le.

Re: près du plateau - Forums MSDN

modifier la propriété RightToLeft du formulaire à l'exécution

Citation du deuxième lien:

  

J'ai trouvé un deuxième bogue en moins de deux jours. Ce nouveau bogue est très critique.

     

J'ai la forme normale avec la propriété RightToLeft définie sur sa valeur par défaut (RightToLeft = False).   Montrons ce formulaire avec Show Function (Form1.Show (moi))

     

Ce formulaire contient un bouton qui modifie le formulaire RightToLeft en Oui au lieu de Non:

     

Private Sub Button1_Click (expéditeur de ByVal en tant que System.Object, ByVal et en tant que System.EventArgs) gère Button1.Click
   Me.RightToLeft = Windows.Forms.RightToLeft.Yes
  End Sub

     

Le formulaire changera son titre avec succès en côté droit.

     

Jusqu'à ce qu'il n'y ait pas de problème.

     

Problème se présentant comme suit

     

Si nous affichons ce formulaire à l'utilisateur à l'aide de la fonction ShowDialog (Me) au lieu de l'afficher à l'aide de Show (Me). Cliquez ensuite sur le bouton qui changera Form RightToLeft en Oui au lieu de Non, le formulaire se fermera soudainement sans raison, et ne lancera même aucune exception.
       C'est le nouveau problème & amp; cela existe aussi dans .NET 3.0 (Orcase) Too.

Était-ce utile?

La solution

Ok ... j'ai une solution rapide pour vous. C'est méchant , c'est un bidouillage , mais cela un peu fonctionne.

D'après ma réponse au question originale :

private bool _rightToLeft;
private void SetRTL(bool setRTL)
{
    _rightToLeft = true;
    ApplyRTL(setRTL, this);
}

private void ApplyRTL(bool yes, Control startControl)
{
    if ((startControl is Panel) || (startControl is GroupBox))
    {
        foreach (Control control in startControl.Controls)
        {
            control.Location = CalculateRTL(control.Location, startControl.Size, control.Size);
        }
    }
    foreach (Control control in startControl.Controls)
        ApplyRTL(yes, control);
}

private Point CalculateRTL(Point currentPoint, Size parentSize, Size currentSize)
{
    return new Point(parentSize.Width - currentSize.Width - currentPoint.X, currentPoint.Y);
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (_rightToLeft)
    {
        _rightToLeft = false;
        e.Cancel = true;
    }
}

Le shneaky doit être attaché à l'événement de clôture du formulaire , puis indiquez-lui de ne pas fermer si vous venez d'effectuer un échange de droite à gauche (_rightToLeft). Après avoir dit de ne pas fermer, vous retirez le drapeau de droite à gauche et laissez la vie se poursuivre.

* bug: un bogue survient lors de la fermeture d'un formulaire ouvert avec .Show (this), mais je suis sûr que vous pouvez y remédier!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top