Se si modifica RightToLeft, le proprietà ShowInTaskbar, Form.ShowDialog () termina inaspettatamente

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

  •  02-07-2019
  •  | 
  •  

Domanda

La finestra di dialogo si chiude con il risultato Annulla, senza eccezioni, come se si fosse premuto il pulsante di chiusura.
L'unico posto sicuro per impostare la proprietà RightToLeft è nel costruttore del modulo.

Mi è venuto in mente che queste informazioni potrebbero far risparmiare tempo a qualcun altro.
Se sei in grado di approfondire il problema: se esiste una conferma ufficiale del bug, cos'altro potrebbe causare la chiusura imprevista di ShowDialog, per favore,

Ri: vicino al vassoio - Forum MSDN

modifica la proprietà Form RightToLeft in fase di esecuzione


Citazione dal secondo link:

  

Ho trovato un secondo bug in meno di due giorni. Questo nuovo bug è molto critico.

     

Ho la forma normale con la proprietà RightToLeft impostata sul valore predefinito (RightToLeft = False).   Mostriamo questo modulo con Show Function (Form1.Show (me))

     

In questo modulo è presente un pulsante che cambia il modulo RightToLeft in Sì anziché in No:

     

Private Sub Button1_Click (mittente ByVal come System.Object, ByVal e As System.EventArgs) Gestisce Button1.Click
   Me.RightToLeft = Windows.Forms.RightToLeft.Yes
  End Sub

     

Il modulo cambierà correttamente il titolo in Lato destro.

     

Fino a questo non ci sono problemi.

     

Problema Si verifica come segue

     

Se visualizziamo questo modulo all'utente usando ShowDialog (Me) Function invece di visualizzarlo usando Show (Me). Quindi fare clic sul pulsante che cambierà il modulo RightToLeft in Sì anziché in No, il modulo si chiuderà all'improvviso senza motivi e non genererà eccezioni.
       Questo è il nuovo problema & amp; esiste anche in .NET 3.0 (Orcase).

È stato utile?

Soluzione

Ok ... ho una soluzione rapida per te. È cattivo , è un hack ma kinda funziona.

Dalla mia risposta al domanda 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;
    }
}

La parte shneaky da associare all'evento di chiusura del modulo e quindi dirgli di non chiudere se hai appena effettuato uno scambio da destra a sinistra (_rightToLeft). Avendo detto di non chiudere, rimuovi la bandiera da destra a sinistra e lascia che la vita continui.

* bug: si verifica un bug che si verifica quando si chiude un modulo aperto con .Show (questo), ma sono sicuro che puoi risolverlo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top