根据MSDN

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

是足够的,未免形式的内容对劳动教养的语言。

但控制得到安置mirrowed仅用于控制立即对形式,
那些内部的一个组框或一个小组 不mirrowed, 除非我把它们放在一个TableLayoutPanel或FlowLayoutPanel前一页.

这是一个很大的手工工作的地方一TableLayoutPanel内各组框, 特别是重新安排控制(一个控制每个表格,填充,保证金,等等)

是否有一个更简单的方法,使mirrowing工作对于所有的控制?

或至少,我怎么可以绕过重新安排的步骤,因为它是一个相当任务与我们的号码的形式?


编辑:RightToLeft酒店的每个控制的形式通过默认是继承的,
这样板和GroupBoxes总是有必要的RightToLeft设置。
尽管如此,我打算重新分配它为他们两个编程和设计,它并没有帮助。

有帮助吗?

解决方案

它确实看到你手上有一个非常讨厌的问题。已经玩了一段时间并提出以下内容:

利用一点递归,您可以运行所有控件,并对陷入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);
}

其他提示

我不记得我第一次看到这个提示覆盖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;
    }

根据这篇文章 Visual Studio2005年:发展阿拉伯语Windows的应用 我只剩下两个选择

  • 继续添加TableLayoutPanels在这里和那里
  • 重新定位,儿童控制对劳动教养改变自己

它是一个真正的遗憾,它必须是那样。

如果您有一个派生自Control的类包含子控件(如 ContainerControl ),您可以添加以下代码以强制所有子控件在父窗体的 RightToLeftLayout <时进行镜像/ code>设置为true,当控件的 RightToLeft 设置为 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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top