2016-11-02 77 views
2

我有一個WinForms應用中,我想要動態對接添加用戶控件到頂端:自動調整大小面板的文本內容

this.Controls.Clear(); 
this.Controls.Add(myCustomControl(){Title="first", content="first text", Dock=DockStyle.Top}); 
this.Controls.Add(myCustomControl(){Title="second", content="very long text, where......", Dock=DockStyle.Top}); 

現在myCostumControl [黃色]是一個具有以下內容的用戶控件:

TopTitle [PINK]: A Label, docked to the top 
BottomContent [GREEN]: A Panel, Fills out the rest of the Control below the TopTitle (Dockstyle Fill) 
TextContent [BLUE]: A multiline Textbox, docked (fill) within the Panel. 

所以它看起來像這樣:

enter image description here

現在我需要實現的是,myCustomControl的高度是根據「TextContent」 - TextBox的文本內容,因此我可以堆疊多個控件。所以如果只有一個「Hello World」,那麼它的高度應該很小,如果我把Windows EULA放進去,它應該很長。

我已經嘗試搞亂所有「AutoSize」屬性我可以讓我的手,但文本框要麼完全消失或它沒有影響。

我也嘗試過改變調整文本框:

Size size = TextRenderer.MeasureText(txtContent.Text, txtContent.Font); 
txtContent.Height = size.Height; 

沒有成功,無論是

+0

顯然,對於同一個控件,不能同時使用'DockStyle.Fill'和'AutoSize'。 – Phil1970

+0

我也嘗試DockStyle.Top爲TextBox。沒有工作,要麼 –

+0

順便說一下,'TextBox'沒有任何'AutoSize'屬性...那麼你如何自動化它呢?自定義代碼? – Phil1970

回答

1

爲了讓您的複合控件自動調整大小,請執行以下設置:

  • 添加Label用戶控制和設置標籤的AutoSize爲false,並設置它的高度,以一個合適的高度,並設置其Dock頂部。
  • 將用戶控件添加TextBox並將其Dock設置爲Fill
  • 倍率SetBoundsCore和計算控制的優選尺寸:

    protected override void SetBoundsCore(int x, int y, int width, int height, 
        BoundsSpecified specified) 
    { 
        var flags = TextFormatFlags.WordBreak | TextFormatFlags.NoPrefix; 
        var proposedSize = new Size(width, int.MaxValue); 
        var size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font, 
         proposedSize, flags); 
        height = Math.Max(size.Height, textBox1.Font.Height) + label1.Height + 5; 
        base.SetBoundsCore(x, y, width, height, specified); 
    } 
    
  • 處理TextBoxTextChanged事件刷新控制的大小時內容文本的變化:

    void textBox1_TextChanged(object sender, EventArgs e) 
    { 
        SetBoundsCore(Left, Top, Width, Height, BoundsSpecified.Size); 
    } 
    

這裏是結果:

enter image description here

+0

你也可能想看看[自動高度屬性的用戶控件](http://stackoverflow.com/questions/38203411/user-control-with-auto-height-property)。 –

+0

如果您對答案有任何疑問,請告知我:) –

0

如果你想myCustomControl被自動調整大小,然後obvioulsy,您不能使用填充停靠任何子控件對接根據父母大小設置孩子的大小,並且希望父母大小根據孩子的大小進行調整。

因此,您應該爲孩子使用表佈局或流佈局。如果您使用表格,那麼您必須對應該適應的行使用自動大小。

然後,整個佈局控件可以設置爲自動調整大小,並且應該停靠在頂部(或可能錨定)。

如果佈局控件不適合可見區域,您可以在父級顯示垂直滾動條。

+0

顯然,單獨的控件需要有一個'AutoSize'屬性......所以如果一個子控件是一個'TextBox',那麼解決方案將不起作用。 – Phil1970