根据MSDN
form.RightToLeftLayout = True;
form.RightToLeft = ifWeWantRTL() ? RightToLeft.True : RightToLeft.False;
足以镜像RTL语言的表单内容。
但是控件放置只会立即对窗体上的控件进行镜像,
GroupBox或Panel 中的那些不会被镜像,除非我将它们放在TableLayoutPanel或FlowLayoutPanel fisrt上。
这是在每个GroupBox中放置TableLayoutPanel的大量手工工作, 尤其是重新排列控件(每个表单元格一个控件,填充,边距等)
是否有更简单的方法使mirrowing适用于所有控件?
或者至少,我怎样才能绕过重新安排的步骤,因为我们的表格数量是一项非常重要的任务?
编辑:默认情况下,表单上每个控件的RightToLeft属性都被继承,
所以Panels和GroupBoxes总是有所需的RightToLeft设置
尽管如此,我试图以编程方式和设计师为他们重新分配它,但它并没有帮助。
答案 0 :(得分:8)
它确实看到你手上有一个非常讨厌的问题。已经玩了一段时间并提出以下内容:
利用一点递归,您可以运行所有控件,并对陷入Pannels和GroupBoxes的控件进行manaul RTL转换。
这是一个快速小代码模拟,我打了一顿。我建议你把它放在你的BaseForm中(希望你有其中一个)并调用基本表格加载。
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);
}
答案 1 :(得分:3)
我不记得我第一次看到这个提示覆盖CreateParams,但在这里你是;) 最快,最简单的方法是从Panel,GroupBox或Usercontrol继承 并覆盖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;
}
答案 2 :(得分:1)
根据文章 Visual Studio 2005: Developing Arabic Windows Forms applications 我只剩下两个选择
很遗憾,必须这样。
答案 3 :(得分:0)
如果您有一个派生自Control的类包含子控件(如ContainerControl
),则可以添加以下代码以强制所有子控件在父窗体的RightToLeftLayout
设置为如果您的控件的RightToLeft
设置为RightToLeft.Yes
,则为true。
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();
}