2011-11-08 104 views
20

我正在編寫一個程序,用戶應該能夠在文本框中編寫文本。我希望文本框自行調整大小,以適應內容。 我已經試過如下:C#調整文本框的大小以適應內容

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8); 
    System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont); 
    this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0); 
} 

我得到一個錯誤,說圖形不適合TextChangedEventArgs工作。有另一種方法可以調整文本框的大小嗎?

+0

您使用的是.NET 1嗎? –

+0

你在Silverlight中試試這個嗎? –

回答

48

你應該嘗試下面的代碼。它對我很好。

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font); 
    textBox1.Width = size.Width; 
    textBox1.Height = size.Height; 
} 

欲瞭解更多信息,請參閱TextRenderer.MeasureText()

+0

我有一個文本框裏面的用戶控件。當文本增長很多時,只有寬度會增加,即使寬度會超過其父項。如何確定父母的寬度然後包裝文本並增加高度? –

1

您將需要使用的createGraphics()形式的方法來創建Graphics實例來衡量的字符串。

TextChangedEventArgs類不具有Graphics特性,那就是PaintEventArgs類傳遞給Paint事件處理

1

的屬性試試這個:

using System.Drawing; 
... 

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    // Determine the correct size for the text box based on its text length 

    // get the current text box safely 
    TextBox tb = sender as TextBox; 
    if (tb == null) return; 

    SizeF stringSize; 

    // create a graphics object for this form 
    using(Graphics gfx = this.CreateGraphics()) 
    { 
     // Get the size given the string and the font 
     stringSize = gfx.MeasureString(tb.Text, tb.Font); 
    } 

    // Resize the textbox 
    tb.Width = (int)Math.Round(stringSize.Width, 0); 

} 

基本上你創建你自己的Graphics對象對於表單,然後根據TextBox的文本和字體進行測量。 using將妥善處理Graphics對象 - 您以前的代碼將會泄漏可怕!

2

您綁定了錯誤的事件,並且無法使用TextChangedEventArgs對象中的圖形對象。

嘗試使用TextChanged事件。下面的代碼片段工作:

public Form1() 
{ 
    InitializeComponent(); 

    this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
} 

void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    System.Drawing.SizeF mySize = new System.Drawing.SizeF(); 

    // Use the textbox font 
    System.Drawing.Font myFont = textBox1.Font; 

    using (Graphics g = this.CreateGraphics()) 
    { 
     // Get the size given the string and the font 
     mySize = g.MeasureString(textBox1.Text, myFont); 
    } 

    // Resize the textbox 
    this.textBox1.Width = (int)Math.Round(mySize.Width, 0); 
} 

}

0

你嘗試設置yourTextBox.AutoSize = true;? 此屬性可能隱藏在GUI設計器中,但您可以在調用InitializeComponent();之後立即在窗體構造函數中設置它。

0

Graphics.Measure串,你可以做ØPaintEventArgs的,而不是TextChangedEventArgs

我想你想是這樣的

System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8); 
Graphics graphics = this.CreateGraphics(); 
SizeF textSize = graphics.MeasureString("This is a test", myFont); 

的問題是,你就不能創造一個圖形對象通過簡單地分配它,因爲它沒有公共構造函數,所以你應該更好地使用TextRenderer.MeasureText,如http://msdn.microsoft.com/en-us/library/y4xdbe66.aspx

TextRenderer不太準確,因爲它使用GDI並且圖形使用GDI +,所以也許你應該從Width屬性獲得的值保留一點餘量。

希望這會有幫助

0

無論目標是什麼。

如果應該根據字符串動態設置文本框的大小,該字符串應該是此框中的文本,沒有很好的選項

原因: MeasureString使用通常的字符串格式化程序作爲自己的寬度和高度的分隔符。 手段,回車和換行符也被解析。導致sizeF.Width和sizeF.Height。

根據字符串(以及它的字體和行數),這兩個變量都可以攜帶值,這些值有時用作文本框的寬度/高度值(因爲它們可以大於父窗體的值這會將文本框的大小調整爲一個大小,其左邊框和底邊框超出父表單)。

一些解決方案仍然可用,取決於目標,人們希望實現。

一個想法是: 在設計器中創建一個文本框,大小= 100 X 100. 啓用文字包裝。我們只是將文本框的寬度調整爲一個由我們自己定義的值(例如,parentform.Width或另一個硬值),然後我們就可以調整文本框的寬度。

這將導致文字換行重新計算文本框中的字符串,這將重新排列文本框內的所有字符,因爲自動換行已啓用。

例如,文本框的高度可以很難設置爲parentform.Height。

但是, 更好:根據方法texbox.GetPositionFromCharIndex(textbox.TextLength -1)的ReturnValue(Point)的Y值動態設置高度。 然後,用Math.Min()確定哪個更小(parentform.Height或Point.Y),並將文本框大小重置爲新大小(previousDeterminedWidth,nowDeterminedHeight)。

請記住(如果滾動條已啓用)將約17個像素添加到寬度計算中。

問候

2

我加入了這個答案,因爲我沒有看到任何其他的正在討論的文本框的fixed width方面。如果您的文本框的寬度固定,並且您只想調整其高度,則可以執行以下操作:

像這樣的東西給出文本的高度,以便如何在多行文字包裝的文本框中繪製文本:

SizeF MessageSize = MyTextBoxControl.CreateGraphics() 
           .MeasureString(MyTextBoxControl.Text, 
               MyTextBoxControl.Font, 
               MyTextBoxControl.Width, 
               new StringFormat(0)); 

我不知道StringFormat應該是什麼,但值StringFormatFlags似乎並不適用於默認TextBox彌補。

現在用MessageSize.Height您知道文本框中文本的高度。

1

我有同樣的問題,我用一種更簡單的方法解決了它。

我使用了Label控件的AutoSize屬性..我在窗體中添加了一個不可見的標籤,將其AutoSize屬性設置爲True。當我需要改變我的文本框的大小,我用這個代碼:

MyLabel.Text = MyTextBox.Text; 
MyTextBox.Size = MyLabel.Size; 

我設置的最大和標籤獲得更好的結果的最小尺寸。 玩得開心

相關問題