Wie RightToLeftLayout Arbeit für die Kontrollen innerhalb Groupboxes und Panels machen?

StackOverflow https://stackoverflow.com/questions/147657

  •  02-07-2019
  •  | 
  •  

Frage

Laut MSDN

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

ist genug, um den Formularinhalt für RTL Sprachen mirrow.

Aber Kontrollen Platzierung wird gespiegelt nur für Kontrollen sofort auf dem Formular,
diejenigen innerhalb eines GroupBox oder einem Panel nicht gespiegelt , es sei denn, ich legte sie auf einen Table oder Flowlayoutpanel fisrt.

Dies ist eine viel Handarbeit eine Table in jedem GroupBox zu platzieren, und insbesondere die Bedienelemente neu zu ordnen (eine pro Steuertabellenzelle, Klotzen, margin, etc)

Gibt es einen einfacheren Weg mirrowing Arbeit für alle Kontrollen zu machen?

oder zumindest, wie kann ich die Neuanordnung Schritt umgehen, denn es ist eine schwierige Aufgabe mit unserer Reihe von Formen?


Bearbeiten : RightToLeft Eigenschaft für jedes Steuerelement auf dem Formular standardmäßig vererbt wird,
so Panels und Groupboxes immer die benötigte RightToLeft Einstellung.
Dennoch tryed ich es für sie beide programmatisch neu zuzuordnen und von Designern, hat es nicht helfen.

War es hilfreich?

Lösung

Es ist zu sehen, dass man ziemlich unangenehmes Problem an den Händen hat. Habe mit ihm für eine Weile gespielt und kommt mit dem folgenden:

Die Nutzung eines kleinen Rekursion können Sie laufen zwar alle Kontrollen und machen die manaul RTL Umwandlung für die in paneele gefangen Kontrollen und Gruppenfeldern.

Dies ist ein quick wenig Mock von Code, den ich zusammen schlug. Ich würde vorschlagen, dass Sie dies in Ihrer Baseform (her Sie eines von diesen haben gehofft) und rufe auf Basis Form Last.

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);
}

Andere Tipps

Ich erinnere mich nicht, wo ich zum ersten Mal diesen Tipp sah CreateParams auf zwingende, aber hier sind Sie;) schnellste und einfachste Weg ist, aus dem Panel, GroupBox oder Usercontrol vererben und überschreiben die CreateParams Property

    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;
    }

Laut dem Artikel Visual Studio 2005: Entwicklung von Arabic Windows Forms-Anwendungen Ich bin links mit nur zwei Alternativen

  • weiter TableLayoutPanels hier und da das Hinzufügen
  • reposition Kind Kontrollen auf RTL ändern mich

Es ist wirklich schade, dass es so sein muss.

Wenn Sie eine Klasse abgeleitet von Control, die untergeordneten Steuerelemente enthält (wie ein ContainerControl), können Sie den folgenden Code hinzu, um alle Kinder zu spiegeln steuern zu erzwingen, wenn die RightToLeftLayout der Mutterform auf true gesetzt ist und wenn Ihre Kontrolle RightToLeft gesetzt RightToLeft.Yes zu.

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        Form parent = this.FindForm();
        bool parentRightToLeftLayout = parent != null ? parent.RightToLeftLayout : false;
        if ((this.RightToLeft == RightToLeft.Yes) && parentRightToLeftLayout)
        {
            createParams.ExStyle |= 0x500000; // WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT
            createParams.ExStyle &= ~0x7000; // WS_EX_RIGHT | WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR
        }
        return createParams;
    }
}

protected override void OnRightToLeftChanged(EventArgs e)
{
    base.OnRightToLeftChanged(e);
    RecreateHandle();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top