كيفية جعل RightToLeftLayout العمل على التحكم داخل GroupBoxes و لوحات ؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

وفقا MSDN

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

يكفي أن mirrow شكل المحتوى RTL اللغات.

ولكن ضوابط التنسيب يحصل mirrowed فقط تسيطر على الفور على النموذج ،
تلك داخل مربع المجموعة أو الفريق ، لا mirrowed, إلا إذا كنت وضعت لهم على TableLayoutPanel أو FlowLayoutPanel fisrt.

هذا هو الكثير من العمل اليدوي إلى مكان TableLayoutPanel داخل كل مربع المجموعة, وخاصة إعادة ترتيب عناصر التحكم (عنصر تحكم واحد في خلية الجدول الحشو, هامش, الخ)

هل هناك طريقة أسهل لعمل mirrowing العمل لجميع الضوابط ؟

أو على الأقل كيف يمكن تجاوز ترتيب الخطوة على أنها مهمة جدا مع عدد من الأشكال ؟


تحرير:الخاصية RightToLeft لكل عنصر تحكم في النموذج الافتراضي هو موروث ،
حتى لوحات GroupBoxes دائما في حاجة RightToLeft الإعداد.
ومع ذلك, لقد كنت أحاول أن تعيين لهم على حد سواء برمجيا من مصمم ، لم يساعد.

هل كانت مفيدة؟

المحلول

فإنه لا أرى أن لديك مشكلة سيئة على يديك.قد لعبت معه لفترة من الوقت والخروج التالية:

مما يجعل استخدام القليل من العودية يمكنك تشغيل على الرغم من كل الضوابط و هل الكتيبات RTL تحويل تلك الضوابط المحاصرين في بانيلس و GroupBoxes.

هذا هو سريعة قليلا وهمية من التعليمات البرمجية التي ضربت معا.أود أن أقترح عليك وضع هذا في 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);
}

نصائح أخرى

أنا لا أتذكر أين رأيت هذا غيض على تجاوز CreateParams ولكن ها أنت هنا ;) أسرع وأسهل طريقة هي أن ترث من الفريق مربع المجموعة أو 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 التطبيقات أنا تركت مع اثنين فقط من البدائل

  • استمر في إضافة TableLayoutPanels هنا وهناك
  • إعادة الطفل ضوابط RTL تغيير نفسي

ومن المؤسف حقا أنه يجب أن يكون بهذه الطريقة.

إذا كان لديك فئة مشتقة من التحكم الذي يحتوي على الطفل التحكم (مثل ContainerControl) ، يمكنك إضافة التعليمات البرمجية التالية إلى قوة جميع الأطفال الضوابط إلى المرآة عند الوالد النموذج RightToLeftLayout تعيين إلى true وعندما التحكم الخاصة بك 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