5

MSDNによると

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

RTL言語のフォームコンテンツを模倣するには十分です。

ただし、コントロールの配置は、フォーム上のコントロールに対してのみミローされます。TableLayoutPanelまたはFlowLayoutPanelの最初に配置しない限り
、GroupBoxまたはPanel内のコントロールはミローされません。

これは、各GroupBox内にTableLayoutPanelを配置するため、特にコントロール(テーブルセルごとに1つのコントロール、パディング、マージンなど)を再配置するための多くの手作業です。

すべてのコントロールでミローイングを機能させる簡単な方法はありますか?

または、少なくとも、フォームの数が非常に多いため、再配置の手順を​​バイパスするにはどうすればよいですか?


編集:フォームの各コントロールのRightToLeftプロパティはデフォルトで継承される
ため、PanelsとGroupBoxesには常に必要なRightToLeft設定があります。
それにもかかわらず、私はプログラムとデザイナーの両方からそれを再割り当てしようとしましたが、それは役に立ちませんでした。

4

4 に答える 4

8

あなたの手にかなり厄介な問題があることがわかりました。しばらく遊んで、次のことを考え出しました。

少しの再帰を利用して、すべてのコントロールを実行し、Pannels と GroupBoxes にトラップされたコントロールのマニュアル RTL 変換を実行できます。

これは、私が一緒に叩いたコードの簡単なモックです。これを BaseForm に入れて (これらのいずれかを持っていることを願っています)、base form load を呼び出すことをお勧めします。

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 フォーム アプリケーションの開発に関する記事によると、 2 つの選択肢しか残っていません。

  • あちこちに TableLayoutPanels を追加し続けます
  • RTL で子コントロールを再配置する 自分自身を変更する

そうでなければならないのは本当に残念です。

于 2008-09-29T08:54:30.013 に答える