Làm cách nào chúng tôi có thể có chức năng gói từ cho nhãn trong Windows Forms ?
Tôi đặt một nhãn trong một bảng điều khiển và thêm một số văn bản để nhãn động. Nhưng nó vượt quá chiều dài bảng điều khiển. Làm sao tôi có thể giải quyết việc này?
Làm cách nào chúng tôi có thể có chức năng gói từ cho nhãn trong Windows Forms ?
Tôi đặt một nhãn trong một bảng điều khiển và thêm một số văn bản để nhãn động. Nhưng nó vượt quá chiều dài bảng điều khiển. Làm sao tôi có thể giải quyết việc này?
Câu trả lời:
Câu trả lời nhanh: tắt AutoSize .
Vấn đề lớn ở đây là nhãn sẽ không tự động thay đổi chiều cao (chỉ chiều rộng). Để có được điều này, bạn sẽ cần phải phân lớp nhãn và bao gồm logic thay đổi kích thước dọc.
Về cơ bản những gì bạn cần làm trong OnPaint là:
Bạn cũng sẽ cần đặt cờ kiểu ResizeRedraw trong hàm tạo.
Trên thực tế, câu trả lời được chấp nhận là phức tạp không cần thiết.
Nếu bạn đặt nhãn thành AutoSize, nó sẽ tự động phát triển với bất kỳ văn bản nào bạn đặt trong đó. (Điều này bao gồm tăng trưởng dọc.)
Nếu bạn muốn làm cho nó bao bọc từ ở độ rộng cụ thể, bạn có thể đặt thuộc tính MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Đã thử nghiệm và hoạt động.
Dock
tính của cả nhãn và bảng điều khiển Top
, thay vì giải pháp của tôi.
OnResize
lấy phụ huynh và gọimyLabel.MaximumSize = new Size(Bounds.Width, 0);
Trong trường hợp của tôi (nhãn trên bảng) tôi đặt label.AutoSize = false
và label.Dock = Fill
. Và văn bản nhãn được bọc tự động.
Tin xấu: không có tài sản autowrap.
Tin tốt: có một ánh sáng ở cuối đường hầm!
Bạn có thể thực hiện điều này theo chương trình để kích thước nó một cách linh hoạt, nhưng đây là giải pháp đơn giản nhất:
MaximumSize = ( Width , height ) trong đó Width = max size bạn muốn nhãn là và Chiều cao = bao nhiêu pixel bạn muốn nó bao bọc
Từ MSDN , Tự động bọc văn bản trong nhãn :
using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
public class GrowLabel : Label {
private bool mGrowing;
public GrowLabel() {
this.AutoSize = false;
}
private void resizeLabel() {
if (mGrowing)
return;
try {
mGrowing = true;
Size sz = new Size(this.Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
this.Height = sz.Height;
}
finally {
mGrowing = false;
}
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
resizeLabel();
}
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
resizeLabel();
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
resizeLabel();
}
}
Height = sz.Height + Padding.Vertical;
)
Tôi đã phải tìm một giải pháp nhanh chóng, vì vậy tôi chỉ sử dụng một TextBox với các thuộc tính đó:
var myLabel = new TextBox
{
Text = "xxx xxx xxx",
WordWrap = true,
AutoSize = false,
Enabled = false,
Size = new Size(60, 30),
BorderStyle = BorderStyle.None,
Multiline = true,
BackColor = container.BackColor
};
Có một câu hỏi hay hơn dựa trên câu trả lời của @hypo
public class GrowLabel : Label {
private bool mGrowing;
public GrowLabel() {
this.AutoSize = false;
}
private void resizeLabel() {
if (mGrowing)
return;
try {
mGrowing = true;
int width = this.Parent == null ? this.Width : this.Parent.Width;
Size sz = new Size(this.Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
this.Height = sz.Height + Padding.Bottom + Padding.Top;
} finally {
mGrowing = false;
}
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
resizeLabel();
}
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
resizeLabel();
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
resizeLabel();
}
}
int width = this.Parent == null ? this.Width : this.Parent.Width;
điều này cho phép bạn sử dụng nhãn tự động phát triển khi được gắn vào cha mẹ, ví dụ như bảng điều khiển.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
ở đây chúng tôi chăm sóc phần đệm cho phần trên và phần dưới.
Xử lý ClientSizeChanged event
bảng điều khiển, làm cho nhãn điền vào chỗ trống:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Đặt Auto-Size
cho nhãn thànhtrue
Dock
cho nhãn thànhFill
Nếu bảng điều khiển của bạn giới hạn độ rộng của nhãn, bạn có thể đặt thuộc tính Anchor của nhãn thành Trái, Phải và đặt Tự động kích thước thành đúng. Đây là khái niệm tương tự như lắng nghe SizeChanged
sự kiện của Hội đồng và cập nhật MaximumSize của nhãn thành new Size(((Control)sender).Size.Width, 0)
như được đề xuất bởi câu trả lời trước đó . Tất cả các bên được liệt kê trong thuộc tính Anchor đều được neo vào bên trong tương ứng của Control. Vì vậy, liệt kê hai mặt đối diện trong Anchor đặt hiệu quả kích thước của điều khiển. Neo sang trái và phải đặt thuộc tính Width của Control và Neo ở trên và dưới sẽ đặt thuộc tính Chiều cao của nó.
Giải pháp này, như C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Nếu bạn thực sự muốn đặt chiều rộng nhãn độc lập với nội dung, tôi thấy rằng cách dễ nhất là:
Bây giờ nhãn có chiều rộng không đổi, nhưng nó tự động điều chỉnh chiều cao của nó.
Sau đó, cho văn bản động, giảm kích thước phông chữ. Nếu cần, hãy sử dụng đoạn mã này trong phần phụ nơi đặt văn bản nhãn:
If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
Dim naam As String = Label12.Font.Name
Dim size As Single = Label12.Font.SizeInPoints - 1
Label12.Font = New Font(naam, size)
End If
Điều này đã giúp tôi trong Biểu mẫu của mình được gọi là InpitWindow: In Designer for Label:
AutoSize = true;
Achors = Top, Left, Right.
private void InputWindow_Shown(object sender, EventArgs e) {
lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
lbCaption.Margin.Right - lbCaption.Margin.Left,
Screen.GetWorkingArea(this).Height / 2);
this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
//Uncomment this line to prevent form height chage to values lower than initial height
//this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
Screen.GetWorkingArea(this).Height / 2);
}
Câu trả lời đơn giản cho vấn đề này là thay đổi thuộc tính DOCK của Nhãn. Đó là "KHÔNG" theo mặc định.
Nếu bạn đang nhập văn bản vào nhãn trước, bạn có thể làm điều này.
Sử dụng style="overflow:Scroll"
trong nhãn như trong HTML dưới đây. Điều này sẽ thêm thanh cuộn trong nhãn trong bảng điều khiển.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>