Si cambia RightToLeft, ShowInTaskbar properties, Form.ShowDialog () termina inesperadamente
-
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 SubEl 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.
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.