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

时间:2016-01-06 05:32:30

标签: c# .net winforms localization right-to-left

虽然这个问题足以适用于网络,但我特别对WinForms感兴趣。

应用程序UI在LTR和RTL语言之间切换而不会发生意外。唯一的障碍是放置与输入控件(如文本框)相关联的标签。

从左到右:
Left to Right

从右到左:
Right to Left

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

是否有一种通用的,程序化的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

选项1 - 镜像表格(镜像标题栏)​​

如果RightToLeftLayoutRightToLeft属性都为true,则会为表单启用镜像,控件放置和文本流将从右向左。因此,将RightToLeftLayout设置为true并将RightToLeft设置为yes,以便从右到左完成布局。

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

选项2 - 镜像面板(不镜像标题栏)​​

如果你不喜欢左到右的标题栏和控制框,你应该自己创建你的右到左容器并将控件放入其中,然后将容器的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 的屏幕截图。查看标题栏左侧的“关闭”按钮:

enter image description here

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

enter image description here