2008-09-29 12 views
5

Según MSDN¿Cómo hacer que RightToLeftLayout funcione para controles dentro de GroupBoxes y Paneles?

form.RightToLeftLayout = True; 
form.RightToLeft = ifWeWantRTL() ? RightToLeft.True : RightToLeft.False; 

es suficiente para mirrow el contenido del formulario para idiomas RTL.

Pero la colocación de los controles se espeja sólo para controles de inmediato en el formulario,
los que están dentro de un GroupBox o un panel no se espeja, a menos que los puse en un TableLayoutPanel o una fisrt FlowLayoutPanel.

Esta es una gran cantidad de trabajo manual para colocar una TableLayoutPanel dentro de cada GroupBox, y especialmente para reorganizar los controles (un control por cada celda de la tabla, relleno, márgenes, etc.)

¿Hay una manera más fácil de hacer trabajo de espejos para todos los controles?

O al menos, ¿cómo puedo omitir el paso de reorganización, ya que es una gran tarea con nuestro número de formularios?


Editar: propiedad RightToLeft para cada control en el formulario por defecto es heredado, por lo
Paneles y GroupBoxes siempre tienen la configuración RightToLeft necesario.
Sin embargo, traté de reasignarlos para ellos, tanto programáticamente como de diseñador, no sirvió de nada.

+0

http://stackoverflow.com/a/26097090/4038978 –

Respuesta

8

Se ve que tiene un problema bastante desagradable en sus manos. Han jugado con esto por un tiempo y presentan lo siguiente:

Haciendo uso de una pequeña recursión, puede ejecutar todos los controles y realizar la conversión RTL manaul para los controles atrapados en Pannels y GroupBoxes.

Esto es rápido pequeño código falso que di una bofetada. Sugeriría que coloques esto en tu BaseForm (aquí está la esperanza de que tengas uno de estos) y que invoques la carga de la forma base.

private void SetRTL (bool setRTL) 
{ 
    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); 
} 
+0

AWESOME! Estoy seguro de que puede ser optomised, pero otras personas me pagan dinero, así que me sentí obligado a terminarlo lo más rápido posible. :) – FryHard

+0

ver: http://stackoverflow.com/a/26097090/4038978 –

3

no recuerdo donde vi por primera vez este consejo en materia de exigencias CreateParams, pero aquí estás;) más rápido, y más fácil es heredar del Grupo Especial, GroupBox o Usercontrol y anular la CreateParams Propiedad

protected override CreateParams CreateParams 
    { 
     get 
     { 
      return Control_RTF(base.CreateParams, base.RightToLeft); 
     } 
    } 

    private CreateParams Control_RTF(CreateParams CP, RightToLeft rightToLeft) 
    { 
     if (rightToLeft == System.Windows.Forms.RightToLeft.Yes) 
      CP.ExStyle = ((CP.ExStyle | 0x400000) | 0x100000); 
     return CP; 
    } 
+0

De esta manera GroupBox muestra su leyenda a la izquierda. Luego usé una etiqueta AutoSize en lugar del texto de GroupBox. –

0

Si usted tiene una clase derivada de control que contiene controles secundarios (como un ContainerControl), puede agregar el siguiente código para obligar a todos los controles secundarios para reflejar cuando se establece de la forma del padre RightToLeftLayout true y cuando su control RightToLeft se establece en RightToLeft.Yes.

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams createParams = base.CreateParams; 
     Form parent = this.FindForm(); 
     bool parentRightToLeftLayout = parent != null ? parent.RightToLeftLayout : false; 
     if ((this.RightToLeft == RightToLeft.Yes) && parentRightToLeftLayout) 
     { 
      createParams.ExStyle |= 0x500000; // WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT 
      createParams.ExStyle &= ~0x7000; // WS_EX_RIGHT | WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR 
     } 
     return createParams; 
    } 
} 

protected override void OnRightToLeftChanged(EventArgs e) 
{ 
    base.OnRightToLeftChanged(e); 
    RecreateHandle(); 
} 
Cuestiones relacionadas