2008-09-29 2 views
5

Laut MSDNWie funktioniert RightToLeftLayout für Steuerelemente in GroupBoxen und Panels?

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

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

Aber Kontrollen Platzierung wird gespiegelt nur für Kontrollen sofort auf dem Formular,
jene in einem GroupBox oder einem Panel nicht gespiegelt, wenn ich sie auf einem Table oder Flowlayoutpanel fisrt setzen.

Dies ist eine viel Handarbeit eine Table in jedem GroupBox zu platzieren, und insbesondere die Bedienelemente neu zu ordnen (eine Kontrolle pro Tabellenzelle, Polsterung, Marge, etc.)

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

Oder zumindest, wie kann ich den Neuanordnungsschritt umgehen, denn es ist eine ziemliche Aufgabe mit unserer Anzahl von Formularen?


bearbeiten: RightToLeft Eigenschaft für jedes Steuerelement auf dem Formular standardmäßig vererbt wird,
so Panels und Gruppenfeldern immer die Einstellung RightToLeft benötigt.
Trotzdem habe ich versucht, es für sie sowohl programmgesteuert als auch vom Designer neu zuzuweisen, es hat nicht geholfen.

+0

http://stackoverflow.com/a/26097090/4038978 –

Antwort

8

Es hat gesehen, dass Sie ein ziemlich unangenehmes Problem an Ihren Händen haben. Habe eine Weile mit ihm gespielt und folgendes gefunden:

Mit einer kleinen Rekursion können Sie alle Steuerelemente ausführen und die Manaul RTL-Konvertierung für die in Pannels und GroupBoxen eingeschlossenen Steuerelemente ausführen.

Dies ist eine schnelle kleine Spott von Code, den ich zusammen geschlagen habe. Ich würde vorschlagen, dass Sie dies in Ihre BaseForm (héres hoffen, Sie haben eine von diesen) und rufen Sie die Basisform laden.

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

AWESOME! Ich bin mir sicher, dass es optomisiert werden kann, aber andere Leute zahlen mir Geld, also fühlte ich mich verpflichtet, es so schnell wie möglich zu beenden! :) – FryHard

+0

siehe es: http://Stackoverflow.com/a/26097090/4038978 –

3

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 Inherit 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; 
    } 
+0

Auf diese Weise GroupBox zeigt die Beschriftung auf der linken Seite. Dann habe ich ein AutoSize-Label anstelle des GroupBox-Textes verwendet. –

0

Wenn Sie eine Klasse abgeleitet von Control, die untergeordneten Steuerelemente enthält (wie ein ContainerControl), können Sie den folgenden Code hinzufügen alle Kinder zu zwingen, steuert zu spiegeln, wenn die RightToLeftLayout der Mutterform auf true gesetzt ist und wenn Ihre Kontrolle des RightToLeft ist auf RightToLeft.Yes eingestellt.

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(); 
} 
Verwandte Themen