2008-09-29 31 views
5

根據MSDN如何使RightToLeftLayout適用於GroupBoxes和Panels內的控件?

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

足以mirrow爲RTL語言形式的內容。

但控制放置只得到mirrowed的控件立即在表格上,
那些分組框或面板內不mirrowed,除非我把它們放在一個TableLayoutPanel或FlowLayoutPanel的最前一頁。

這是大量的手工操作的放置一個TableLayoutPanel各組框, 內,特別是重新安排控制

有沒有做一個簡單的方法(每個表格單元格,填充,保證金等一個控制)對所有控件進行反射工作?

或者至少,我怎麼能繞過重新排列的步驟,因爲這是一個相當多的任務與我們的數量形式?


編輯:在默認情況下窗體上的每個控件RightToLeft屬性繼承,
所以面板和GroupBoxes總是有需要從右至左設置。
儘管如此,我嘗試以編程方式和從設計人員爲他們重新分配它,但沒有幫助。

+0

http://stackoverflow.com/a/26097090/4038978 – 2014-09-29 13:21:19

回答

8

它確實看到你手上有一個相當討厭的問題。已經玩了一段時間,並拿出以下內容:

使用一個小遞歸,你可以運行所有的控件,併爲pannels和groupboxes中的那些控件執行manaul RTL轉換。

這是一個快速我sla在一起的小代碼模擬代碼。我建議你把它放在你的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); 
} 
+0

真棒!我確信它可以被選擇,但其他人支付我錢,所以我覺得有義務儘快完成它! :) – FryHard 2008-09-29 13:14:23

+0

看到它:http://stackoverflow.com/a/26097090/4038978 – 2014-09-29 13:20:46

3

我不記得在那裏我第一次看到在覆蓋的CreateParams這個提示,但在這裏,你是;) 最快,最簡單的方法是從小組,分組框中或用戶控件 繼承和覆蓋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; 
    } 
0

如果您有包含子控件(如ContainerControl)從Control派生的類,你可以添加以下代碼強制所有子控件當父窗體的RightToLeftLayout設置爲true,當你控制的鏡像210設置爲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(); 
} 
相關問題