2011-11-08 38 views
20

Tôi đang viết chương trình mà người dùng có thể viết văn bản trong hộp văn bản. Tôi muốn hộp văn bản thay đổi kích thước, vì vậy nó phù hợp với nội dung. Tôi đã thử các cách sau:C# Thay đổi kích thước hộp văn bản cho vừa với nội dung

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); 
} 

Tôi gặp lỗi khi nói rằng Đồ họa không hoạt động cho TextChangedEventArgs. Có cách nào khác tôi có thể thay đổi kích cỡ hộp văn bản không?

+0

Bạn đang sử dụng .NET 1? –

+0

bạn đang thử điều này trong Silverlight? –

Trả lời

48

Bạn nên thử mã giống như dưới đây. Nó đã làm việc tốt cho tôi.

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

Để biết thêm thông tin tham khảo TextRenderer.MeasureText()

+0

Tôi có usercontrol có một TextBox bên trong. Khi văn bản tăng nhiều chỉ chiều rộng sẽ tăng ngay cả chiều rộng sẽ vượt quá từ cha mẹ của nó. Làm thế nào xác định chiều rộng của phụ huynh sau đó bọc văn bản và tăng chiều cao? –

1

Bạn sẽ cần phải sử dụng phương pháp của hình thức CreateGraphics() để tạo ra các ví dụ Graphics để đo chuỗi trên.

Lớp TextChangedEventArgs không có một tài sản Graphics, đó là một tài sản của lớp PaintEventArgs thông qua vào handler Paint kiện

1

Hãy thử điều này:

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); 

} 

Về cơ bản bạn tạo đối tượng Graphics của riêng bạn cho biểu mẫu, sau đó đo lường nó dựa trên văn bản và phông chữ của TextBox. using sẽ xử lý đúng đối tượng Graphics - mã trước đó của bạn sẽ bị rò rỉ khủng khiếp!

2

Ràng buộc của bạn với sự kiện không đúng và bạn không thể sử dụng đối tượng đồ họa trong đối tượng TextChangedEventArgs.

Thử sử dụng sự kiện TextChanged. Đoạn sau đây được làm việc:

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

Cậu cố gắng thiết lập yourTextBox.AutoSize = true;? Thuộc tính này có thể bị ẩn trong trình thiết kế GUI, nhưng bạn có thể đặt nó trong trình tạo biểu mẫu ngay sau cuộc gọi InitializeComponent();.

0

chuỗi Graphics.Measure bạn có thể làm o PaintEventArgs, không phải trên TextChangedEventArgs

Những gì tôi nghĩ rằng bạn muốn là

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

vấn đề này là bạn không thể tạo ra một Graphics đối tượng bằng cách phân bổ nó đơn giản vì nó không có hàm tạo công khai, vì vậy bạn nên đi và sử dụng TextRenderer.MeasureText, như được thực hiện trong http://msdn.microsoft.com/en-us/library/y4xdbe66.aspx

TextRenderer kém chính xác hơn vì nó sử dụng GDI và Graphics sử dụng GDI +, vì vậy có lẽ bạn nên để lại một chút lợi nhuận trên giá trị bạn nhận được từ thuộc tính Width.

Hy vọng điều này sẽ giúp

0

Bất kể mục đích là gì.

Nếu kích thước của hộp văn bản phải được thiết lập động dựa trên chuỗi, phải là văn bản bên trong hộp này, không có tùy chọn tốt đẹp.

Lý do: MeasureString sử dụng trình định dạng chuỗi thông thường làm dấu phân tách cho chiều rộng và chiều cao của riêng nó. Phương tiện, vận chuyển trở lại và nguồn cấp dữ liệu dòng cũng được phân tích cú pháp. Kết quả trong một sizeF.Width và sizeF.Height.

Tùy theo chuỗi (và phông chữ và số dòng của nó) những cả hai biến thể mang giá trị, mà đôi khi vô dụng sẽ được sử dụng như các giá trị chiều rộng/chiều cao của một textbox (vì họ có thể lớn hơn giá trị của parentform và điều này sẽ thay đổi kích thước hộp văn bản thành kích thước, với đường viền trái và dưới ngoài khung văn bản của biểu mẫu gốc).

Một số giải pháp vẫn có sẵn, tùy thuộc vào mục tiêu, bạn muốn đạt được.

Một ý tưởng sẽ là: Tạo hộp văn bản trong thiết kế, kích thước = 100 X 100. bật từ gói.

Trong trình xử lý sự kiện OnTextChanged sự kiện của hộp văn bản, chúng tôi chỉ đổi kích thước chiều rộng của hộp văn bản thành giá trị, được xác định bởi chính chúng ta (ví dụ: parentform.Width hoặc giá trị cứng khác).

Điều này sẽ làm cho từ bọc để tính toán lại chuỗi trong hộp văn bản và điều này sẽ sắp xếp lại tất cả các ký tự bên trong hộp văn bản, bởi vì từ bọc được kích hoạt.

Chiều cao của hộp văn bản có thể được đặt khó khăn thành parentform.Height chẳng hạn.

NHƯNG, tốt hơn: đặt chiều cao động, dựa trên giá trị Y của ReturnValue (Điểm) của phương thức texbox.GetPositionFromCharIndex (textbox.TextLength -1). Sau đó, với Math.Min() xác định, nhỏ hơn (hoặc parentform.Height hoặc Point.Y) và đặt lại kích thước hộp văn bản thành Kích thước mới (previousDeterminedWidth, nowDeterminedHeight).

Hãy ghi nhớ (nếu thanh cuộn được bật) để thêm khoảng 17 pixel vào tính toán chiều rộng của bạn.

Trân trọng

2

tôi thêm câu trả lời này như tôi không nhìn thấy khía cạnh fixed width của một textbox đang được thảo luận trong bất kỳ khác. Nếu bạn có chiều rộng cố định cho hộp văn bản của mình và bạn chỉ muốn điều chỉnh chiều cao của văn bản, bạn có thể làm điều gì đó như sau:

Điều này cho chiều cao của văn bản như cách nó được vẽ trong chính hộp văn bản từ nhiều dòng :

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

tôi không chắc chắn những gì StringFormat nên nhưng các giá trị StringFormatFlags dường như không áp dụng đối với một mặc định TextBox tạo nên.

Bây giờ với MessageSize.Height bạn biết chiều cao của văn bản trong hộp văn bản.

1

Tôi đã gặp vấn đề tương tự và tôi đã giải quyết nó theo cách đơn giản hơn.

Tôi đã sử dụng thuộc tính AutoSize của điều khiển Nhãn .. Tôi đã thêm nhãn vô hình vào biểu mẫu của mình, đặt thuộc tính Tự động hóa thành True. Khi tôi cần thay đổi kích thước của TextBox của tôi, tôi sử dụng mã này:

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

Tôi đặt Kích thước tối đa và tối thiểu của nhãn để có kết quả tốt hơn. Vui chơi

Các vấn đề liên quan