5

根据 MSDN

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

足以镜像 RTL 语言的表单内容。

但是控件的放置只对窗体上的控件立即进行mirrowed,
GroupBox 或 Panel 内的控件不会被 mirrowed,除非我首先将它们放在 TableLayoutPanel 或 FlowLayoutPanel 上。

在每个 GroupBox 中放置一个 TableLayoutPanel 需要大量手动工作,尤其是重新排列控件(每个表格单元格一个控件、填充、边距等)

有没有一种更简单的方法可以使所有控件的镜像工作?

或者至少,我怎样才能绕过重新排列步骤,因为我们的表格数量是一项相当大的任务?


编辑:默认情况下,窗体上每个控件的 RightToLeft 属性都是继承的,
因此 Panels 和 GroupBoxes 始终具有所需的 RightToLeft 设置。
尽管如此,我尝试以编程方式和设计师为他们重新分配它,但没有帮助。

4

4 回答 4

8

它确实看到你手上有一个非常讨厌的问题。玩了一段时间,想出了以下几点:

使用一点递归,您可以运行所有控件,并对那些困在 Pannels 和 GroupBoxes 中的控件进行手动 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);
}
于 2008-09-29T09:38:47.457 回答
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;
    }
于 2011-05-26T01:41:42.347 回答
1

根据文章 Visual Studio 2005:开发阿拉伯语 Windows 窗体应用程序 ,我只剩下两个选择

  • 继续在这里和那里添加 TableLayoutPanels
  • 重新定位 RTL 上的子控件更改自己

真可惜,它必须是那样的。

于 2008-09-29T08:54:30.013 回答
0

如果您有一个从 Control 派生的包含子控件(如 a ContainerControl)的类,则可以添加以下代码以强制所有子控件在父窗体RightToLeftLayout设置为 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();
}
于 2013-05-03T19:27:58.620 回答