如何使RightToLeftLayout可用于GroupBoxes和Panel中的控件?

时间:2020-03-06 14:51:42  来源:igfitidea点击:

根据MSDN

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

足以复制RTL语言的表单内容。

但是控件位置仅在窗体上立即用于控件位置,
除非我将它们放在TableLayoutPanel或者FlowLayoutPanel字段上,否则不会对GroupBox或者Panel中的内容进行复制。

将TableLayoutPanel放置在每个GroupBox内的工作量很大,
尤其是重新排列控件(每个表格单元格,填充,边距等一个控件)

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

或者至少,我如何绕过重新排列步骤,因为这对我们的表格数量来说是一项艰巨的任务?

编辑:默认情况下,窗体上每个控件的RightToLeft属性是继承的,
因此Panel和GroupBoxes始终具有所需的RightToLeft设置。
尽管如此,我还是尝试以编程方式和从设计师那里为他们重新分配它,但这样做无济于事。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。根根。

解决方案

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

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

真可惜的是那样。

它确实看到我们手上有一个很讨厌的问题。已经玩了一段时间,并提出以下建议:

利用一点递归,我们可以运行所有控件,并对Pannels和GroupBox中捕获的那些控件进行手动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);
}