2011-01-12 38 views
29

Tôi có một Panel mà tôi đang tạo lập trình; ngoài ra tôi đang thêm một số thành phần vào nó.Cách tự động kích thước chiều cao của nhãn nhưng không phải chiều rộng

Một trong các thành phần này là Label sẽ chứa nội dung do người dùng tạo.

Tôi không biết nhãn nên cao bao nhiêu, nhưng nó có chiều rộng cố định.

Làm cách nào để đặt chiều cao sao cho nó hiển thị tất cả văn bản, mà không thay đổi chiều rộng?

Trả lời

60

Chỉ cần sử dụng thuộc tính AutoSize, đặt lại thành True.

Đặt thuộc tính MaximumSize thành, giả sử, (60, 0) để không thể phát triển theo chiều ngang, chỉ theo chiều dọc.

+0

+1. Đơn giản hơn nhiều so với gợi ý của tôi. – Brian

+0

Được chọn làm câu trả lời vì sự đơn giản, câu trả lời của Brian cũng hoàn toàn tốt, nhưng câu trả lời này dễ hiểu và dễ bảo trì hơn. – Malfist

+0

Nếu tôi cần chiều rộng chất lỏng thì sao? – Robin

5

Sử dụng Graphics.MeasureString:

public SizeF MeasureString(
    string text, 
    Font font, 
    int width 
) 

Tham số chiều rộng quy định cụ thể giá trị lớn nhất của các thành phần rộng của SizeF cấu trúc trở (Width). Nếu tham số chiều rộng là nhỏ hơn chiều rộng thực tế của chuỗi , thành phần Chiều rộng được trả về bị cắt ngắn thành giá trị đại diện cho số ký tự tối đa sẽ vừa với chiều rộng được chỉ định. Để chứa toàn bộ chuỗi, thành phần chiều cao được trả về được điều chỉnh thành giá trị cho phép hiển thị chuỗi có bọc ký tự.

Nói cách khác, hàm này có thể tính chiều cao của chuỗi dựa trên chiều rộng của nó.

+1

Tôi nghĩ rằng bạn sẽ có thể sử dụng 'Graphics.FromHwnd (myLabel.Handle)' để lấy đối tượng 'Graphics'. – Brian

+0

+1 Câu trả lời hay. Bất kỳ lý do bạn không bao gồm các Graphics.FromHwnd (myLabel.Handle) bit trong câu trả lời? –

+1

@Confrad: Không. – Brian

0

Nếu bạn có một nhãn và bạn muốn có quyền kiểm soát phù hợp theo chiều dọc, bạn có thể làm như sau:

MyLabel.MaximumSize = new Size(MyLabel.Width, 0) 
MyLabel.Height = MyLabel.PreferredHeight 
MyLabel.MaximumSize = new Size(0, 0) 

này rất hữu ích ví dụ nếu bạn có một nhãn trong một container có thể được thay đổi kích cỡ . Trong trường hợp đó, bạn có thể đặt thuộc tính Anchor để nhãn được định lại kích thước theo chiều ngang nhưng không theo chiều dọc và trong sự kiện thay đổi kích thước, bạn có thể vừa với chiều cao bằng phương pháp ở trên.

Để tránh phù hợp dọc để được hiểu như là một sự kiện thay đổi kích thước mới, bạn có thể sử dụng một boolean:

bool _inVerticalFit = false; 

Và trong trường hợp thay đổi kích thước:

if (_inVerticalFit) return; 
_inVerticalFit = true; 
MyLabel.MaximumSize = new Size(MyLabel.Width, 0) 
MyLabel.Height = MyLabel.PreferredHeight 
MyLabel.MaximumSize = new Size(0, 0) 
_inVerticalFit = false; 
Các vấn đề liên quan