.net - español - ¿Cómo hacer que RightToLeftLayout funcione para los controles dentro de los GroupBoxes y Paneles?
cultureinfo c# español (4)
De acuerdo con el artículo de Visual Studio 2005: Desarrollo de aplicaciones árabes de Windows Forms, me quedan solo dos alternativas
- Continuar agregando TableLayoutPanels aquí y allá
- reposicionar los controles secundarios en RTL cambiar yo mismo
Es una verdadera pena que tenga que ser así.
De acuerdo con MSDN
form.RightToLeftLayout = True;
form.RightToLeft = ifWeWantRTL() ? RightToLeft.True : RightToLeft.False;
es suficiente para duplicar el contenido del formulario para los idiomas RTL.
Pero la ubicación de los controles solo se refleja en los controles que se encuentran inmediatamente en el formulario,
aquellos dentro de un GroupBox o un Panel no son duplicados , a menos que los coloque en TableLayoutPanel o FlowLayoutPanel.
Este es un montón de trabajo manual para colocar un TableLayoutPanel dentro de cada GroupBox, y especialmente para reorganizar los controles (un control por celda de tabla, relleno, margen, etc.)
¿Hay alguna manera más fácil de hacer que la mirilla funcione para todos los controles?
O al menos, ¿cómo puedo evitar el paso de reorganización, ya que es una gran tarea con nuestro número de formularios?
Editar : la propiedad RightToLeft para cada control en el formulario de forma predeterminada es heredada,
por lo tanto, los paneles y los grupos de grupos siempre tienen la configuración RightToLeft necesaria.
Sin embargo, traté de reasignarlos para ellos, tanto programáticamente como de diseñador, no sirvió de nada.
Si se ve que tienes un problema bastante desagradable en tus manos. Ha jugado con esto por un tiempo y piensa en lo siguiente:
Haciendo uso de una pequeña recursión, puedes ejecutar todos los controles y realizar la conversión RTL manaul para los controles atrapados en Pannels y GroupBoxes.
Este es un pequeño simulacro rápido de código 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);
}
no recuerdo dónde vi por primera vez este consejo sobre la anulación de CreateParams, pero aquí está;) la manera más rápida y fácil es Heredar desde el Panel, GroupBox o Usercontrol y anular la propiedad CreateParams
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;
}
Si tiene una clase derivada de Control que contiene controles secundarios (como ContainerControl
), puede agregar el siguiente código para obligar a todos los controles secundarios a reflejar cuando RightToLeftLayout
del formulario padre se establece en true y cuando RightToLeft
su control 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();
}