Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make RightToLeftLayout work for controls inside GroupBoxes and Panels?

According to MSDN

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

is enough to mirrow the form content for RTL languages.

But controls placement gets mirrowed only for controls immediately on the form,
those inside a GroupBox or a Panel are not mirrowed, unless I put them on a TableLayoutPanel or a FlowLayoutPanel fisrt.

This is a lot of manual work to place a TableLayoutPanel inside each GroupBox, and especially to rearrange the controls (one control per table cell, padding, margin, etc)

Is there an easier way to make mirrowing work for all controls?

Or at least, how can I bypass the rearranging step, for it is quite a task with our number of forms?


Edit: RightToLeft property for each control on the form by default is inherited,
so Panels and GroupBoxes always have the needed RightToLeft setting.
Nevertheless, I tryed to reassign it for them both programmatically and from designer, it did not help.

like image 825
eugensk Avatar asked Sep 29 '08 05:09

eugensk


2 Answers

It does seen that you have quite a nasty problem on your hands. Have played with it for a while and come up with the following:

Making use of a little recursion you can run though all the controls and do the manaul RTL conversion for those controls trapped in Pannels and GroupBoxes.

This is a quick little mock of code that I slapped together. I would suggest you put this in your BaseForm (heres hoping you have one of these) and call on 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);
}
like image 69
FryHard Avatar answered Nov 13 '22 16:11

FryHard


i dont remember where i first saw this tip on overriding CreateParams, but here you are ;) fastest, and easiest way is to Inherit from the Panel, GroupBox or Usercontrol and override the 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;
    }
like image 37
Amro Avatar answered Nov 13 '22 14:11

Amro