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

前端 未结 4 1956
执念已碎
执念已碎 2020-12-21 00:22

According to MSDN

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

is enough to mir

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-21 01:04

    If you have a class derived from Control that contains child controls (like a ContainerControl), you can add the following code to force all child controls to mirror when the parent form's RightToLeftLayout is set to true and when your control's RightToLeft is set to RightToLeft.Yes.

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

提交回复
热议问题