2010-03-10 60 views
1

我有一個用戶控件,其中包含一組控件,以便在UI中呈現數據時重用它們。我已經嘗試實現「彈出」選項,將重新從父窗體上的另一個容器控件(一個面板,例如),創建一個新的標籤頁,然後將控件添加到標籤頁。如何修改已重新添加到TabPage的控件?

不幸的是,當控件添加到TabPage時,它的大小似乎被鎖定到最後一個父對象的顯示方式。

我覆蓋了ParentChanged事件來檢測控件何時實際添加到TabPage。如果我檢查大小,請嘗試將大小設置爲TabPage的ClientRectangle,然後重新檢查大小 - 它不會更改。設置Dock屬性不會改變這種行爲(尤其是填充)。

protected override void OnParentChanged(EventArgs e) 
{ 
    if (this.Parent != null) 
    { 
     Size oldSize = this.Size; 

     this.Size = this.Parent.ClientRectangle.Size; 

     if (this.Size == oldSize) 
     { 
      // this is where we end up 
      throw new Exception("We didn't change size!"); 
     } 
    } 
} 

回答

0

控制首先加入到一個容器控件。通過反射器潛入容器代​​碼的腸內,它爲正在重新設置的控件設置最小/最大大小值。我錯誤地認爲默認的最小/最大設置保留爲設計者的默認設置。容器控制不幸的是決定不同。去,去,反射!這種行爲當然沒有記錄。

感謝大家的幫助。

0

我懷疑如果你已經設置爲停靠的控制,那麼它可能會忽略試圖改變它的大小/位置。我個人會關閉Dock/Anchor/AutoSize行爲,並手動設置控件的位置和大小。我已經做了很多這類事情,從來沒有遇到任何問題,所以我懷疑你只是在爭取一個自動佈局選項,而且它是贏家。

如果你想碼頭爲你做的工作,你可能需要踢啓動其佈局的重新計算的標籤? (有一個Control.LayoutEngine對象可以做到這一點,但我只是在這裏假設一個可能的調查途徑 - 我自己沒有嘗試過)

我希望這可能會給你一些想法,反正...

相關問題