Groupbox 및 패널 내부의 컨트롤을 위해 RightToleftLayout 작동하는 방법은 무엇입니까?

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

  •  02-07-2019
  •  | 
  •  

문제

MSDN에 따르면

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

RTL 언어의 양식 컨텐츠를 미색하기에 충분합니다.

그러나 컨트롤 배치는 양식의 즉시 컨트롤에 대해서만 미로화됩니다.
그룹 박스 또는 패널 내부의 사람들 미로가 아닙니다, 내가 tableLayoutPanel 또는 FlowLayoutPanel fisrt에 넣지 않는 한.

이것은 각 그룹 상자 안에 TableLayoutPanel을 배치하고 특히 컨트롤을 재 배열하기위한 많은 수동 작업입니다 (테이블 셀당 하나의 컨트롤, 패딩, 마진 등).

모든 컨트롤을 위해 미로 잉을 작동시키는 더 쉬운 방법이 있습니까?

아니면 적어도, 재 배열 단계를 우회 할 수있는 방법은 무엇입니까? 왜냐하면 양식 수의 수와 상당한 작업이기 때문입니까?


편집하다: 기본적으로 양식의 각 컨트롤에 대한 RightToleft 속성은 상속됩니다.
따라서 패널과 그룹 박스에는 항상 필요한 RightToleft 설정이 있습니다.
그럼에도 불구하고, 나는 프로그래밍 방식으로 그리고 디자이너로부터 그들을 위해 그것을 재 할당하려고 노력했지만, 그것은 도움이되지 않았다.

도움이 되었습니까?

해결책

그것은 당신이 당신의 손에 꽤 불쾌한 문제가 있다는 것을 보았습니다. 잠시 동안 연주하고 다음을 생각해 냈습니다.

약간의 재귀를 사용하면 모든 컨트롤을 통해 실행할 수 있으며 패널과 그룹 박스에 갇힌 해당 컨트롤을 위해 Manaul RTL 변환을 수행 할 수 있습니다.

이것은 빠른 내가 함께 때리는 작은 코드 조롱. 나는 이것을 당신의 Baseform에 넣고 (이들 중 하나를 갖기를 바라고 있음) 기본 형태로드를 호출하는 것이 좋습니다.

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

다른 팁

나는 Createparam을 우선적으로 보는 것에 대한이 팁을 처음 본 것을 기억하지 못하지만 여기에서 가장 빠른 방법은 가장 빠르며 가장 쉬운 방법은 패널, 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;
    }

기사에 따르면Visual Studio 2005 : 아랍어 Windows 개발 응용 프로그램 개발나는 단지 두 가지 대안이 남았습니다

  • 여기 저기 TableLayoutPanel을 계속 추가하십시오
  • RTL에 대한 아동 컨트롤을 재배치합니다

그것이 그렇게해야한다는 것은 정말 유감입니다.

아동 통제가 포함 된 컨트롤에서 파생 된 수업이있는 경우 ( ContainerControl), 다음 코드를 추가하여 부모가 양식의 경우 모든 어린이 컨트롤을 거울로 강제 할 수 있습니다. RightToLeftLayout 진실로 그리고 당신의 컨트롤이있을 때 RightToLeft 설정되었습니다 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();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top