Si cambia RightToLeft, ShowInTaskbar properties, Form.ShowDialog () termina inesperadamente

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

  •  02-07-2019
  •  | 
  •  

Pregunta

El diálogo se cierra con el resultado de Cancelar, sin excepciones, como si hubiera presionado su botón de cerrar.
El único lugar seguro para establecer la propiedad RightToLeft es en el constructor de formularios.

Se me ocurrió que esta información podría ahorrar el tiempo de otra persona.
Si puede explicar el problema: si hay una confirmación de error oficial, ¿qué otra cosa podría hacer que ShowDialog termine inesperadamente, por favor?

Re: close to tray - MSDN Forums

cambiar la propiedad de Forma RightToLeft en tiempo de ejecución


Cita del segundo enlace:

  

He encontrado un segundo error en menos de dos días. Este nuevo error es muy crítico.

     

Tengo la forma Normal con la propiedad RightToLeft establecida en su valor predeterminado (RightToLeft = False).   Mostremos este formulario con Show Function (Form1.Show (me))

     

En este formulario hay un botón que cambia el Formulario RightToLeft a Sí en lugar de No:

     

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

     

El formulario cambiará su título con éxito al lado derecho.

     

Hasta esto no hay problema.

     

El problema se presenta de la siguiente manera

     

Si mostramos este formulario al usuario utilizando la función ShowDialog (Me) en lugar de mostrarlo usando Show (Me). Luego haga clic en el botón que cambiará la Forma a la derecha hacia Sí en lugar de No, la Forma se cerrará repentinamente sin razones, e incluso no lanzará ninguna excepción.
       Este es el nuevo problema & amp; También existe en .NET 3.0 (Orcase) también.

¿Fue útil?

Solución

Ok ... Tengo una solución rápida para ti. Es desagradable , es un truco pero un poco funciona.

De mi respuesta a la pregunta original :

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 relámpago la adjunta al evento de cierre de formulario y luego le indica que no cierre si acaba de realizar un intercambio de derecha a izquierda (_rightToLeft). Habiendo dicho que no está cerrado, quita la bandera de derecha a izquierda y deja que la vida continúe.

* error: hay un error que se produce al cerrar un formulario abierto con .Show (esto), pero estoy seguro de que puedes solucionarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top