2012-02-27 262 views
1

我有一個使用GDI +繪製文本和圖形的自定義UserControl。通常我在另一個控件中使用DockStyle.Bottom停靠它。在自定義用戶控件中實現自動大小

此控件的大小由使用Graphics.MeasureString()的自定義佈局確定。因此,每次寬度更改時都需要重新計算高度,當父寬度更改時會更改寬度更改。

目前我在其OnSizeChanged事件中設置此控件的高度。不過,我注意到一些錯誤。有時,當我調整父級的大小時,即使它設置爲DockStyle.Bottom,控件也不會觸及父級的底部。我使用Spy ++來分析控件邊界,控件和父邊之間只有一些空白空間約20像素。

我想在此用戶控件中實現一個適當的AutoSize,並假設頂部或底部DockStyle。

+0

嘗試爲FlowLayoutPanel和UserControl本身設置AutoSize爲true? – 2012-02-27 22:14:53

+0

不使用FlowLayoutPanel。 – 2012-02-27 22:19:36

+0

爲此使用FlowLayoutPanel有什麼問題嗎?或者如何設置Anchor?如果您在用戶控件的所有控件上使用錨點和停靠點,並將它們設置爲停靠在控件邊緣,則控件將使用UserControl調整大小,並且現在可以將錨點/停靠點也設置爲UserControl。當您結合UserControl的Anchor和Dock屬性設置選項時,控件的邊緣會顯示到UI的其他部分。當UI被調整大小時,您的控件也將被正確調整大小。 – 2012-02-27 22:29:09

回答

1

WindowsForms的DefaultLayout引擎在佈局停靠控件方面有相當多的邏輯。我會推薦一個反編譯器(dotPeek,Reflector等)並反編譯DefaultLayout類。

還有就是控制本身,它的孩子,無論是覆蓋的getPreferredSize等等等等

之間的互動很多也許當你明白這下你的getPreferredSize就是所謂的背景下,你會得到一個更好的主意如何實現它。

就樣例實現而言,再次比Windows控件本身更好?反編譯幾個。這是來自ToolStripItem的示例

public virtual Size GetPreferredSize(Size constrainingSize) 
    { 
     constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize); 
     return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size; 
    } 

祝您好運!