控制 LTR 和 RTL 语言之间的对齐切换

Control alignment switching between LTR and RTL languages

虽然这个问题很笼统,可以应用于网络,但我对 WinForms 特别感兴趣。

应用程序 UI 可以在 LTR 和 RTL 语言之间顺利切换。唯一的障碍是放置与文本框等输入控件关联的标签。

从左到右:

从右到左:

RTL 图像上的标签位置也应相应更改。

是否有通用的、程序化的方法来实现这一点?

选项 1 - 镜像形式(也镜像标题栏)​​

如果 RightToLeftLayoutRightToLeft 属性都为真,将为窗体打开镜像,控件放置和文本流将为 right-to-left。因此,将 RightToLeftLayout 设置为 true 并将 RightToLeft 设置为 yes 以获得从右到左的完整布局。

这样,表单标题栏也会被镜像,控制框也会显示在左侧。

选项 2 - 镜像面板(不镜像 title-bar)

如果您不喜欢从右到左的标题栏和左边的控件框,您应该自己创建从右到左的容器并将控件放入其中,然后设置容器的 RightToLeftLayout为 true 并将容器的 RightToLeft 设置为 yes 以在不更改标题栏和控制框布局的情况下在容器中拥有完整的从右到左布局:

using System;
using System.ComponentModel;
using System.Windows.Forms;
public class ExPanel : Panel
{
    const int WS_EX_LAYOUTRTL = 0x400000;
    const int WS_EX_NOINHERITLAYOUT = 0x100000;
    private bool rightToLeftLayout = false;

    [Localizable(true)]
    public bool RightToLeftLayout
    {
        get { return rightToLeftLayout; }
        set
        {
            if (rightToLeftLayout != value)
            {
                rightToLeftLayout = value;
                this.RecreateHandle();
            }
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams CP;
            CP = base.CreateParams;
            if (this.RightToLeftLayout &&
                this.RightToLeft == System.Windows.Forms.RightToLeft.Yes)
                CP.ExStyle = CP.ExStyle | WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT;
            return CP;
        }
    }
}

截图

这是选项 1 的屏幕截图。查看标题栏左侧的关闭按钮:

这是选项 2 的屏幕截图。查看标题栏右侧的关闭按钮: