.net - 如何使 RightToLeftLayout 适用于 GroupBox 和面板内的控件?

标签 .net winforms localization

根据MSDN

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

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

但是控件的放置仅针对直接位于表单上的控件进行镜像,
GroupBox 或 Panel 内的内容不会被镜像,除非我首先将它们放在 TableLayoutPanel 或 FlowLayoutPanel 上。

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

是否有更简单的方法使镜像适用于所有控件?

或者至少,我怎样才能绕过重新排列步骤,因为对于我们的表单数量来说,这是一项艰巨的任务?

<小时/>

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

最佳答案

它确实看到你遇到了一个非常棘手的问题。玩了一段时间并得出以下结论:

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

关于.net - 如何使 RightToLeftLayout 适用于 GroupBox 和面板内的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/147657/

相关文章:

c# - DDD设计理解

c# - WCF 和 SOAP 1.1

.net - LINQBridge用户: is it feature-complete?

c# - 将枚举数据绑定(bind)到复选框 C#

C#:资源文件重构

linux - Centos 上的 zip 命令不保留法语特殊字符

c# - ArgumentOutOfRangeException 出现奇怪的本地化问题

.net - 在同一解决方案文件中同时具有.NET Framework和.NET Core项目的Azure DevOps中构建.sln

c# - 用户控制允许删除

c# - 循环遍历 datagridview 并读取 CheckBoxColumn 值