หนึ่งจะได้รับฟังก์ชั่นการตัดคำLabel
สำหรับข้อความที่ออกไปนอกขอบเขตได้อย่างไร
หนึ่งจะได้รับฟังก์ชั่นการตัดคำLabel
สำหรับข้อความที่ออกไปนอกขอบเขตได้อย่างไร
คำตอบ:
คำตอบอย่างรวดเร็ว: สลับปิด AutoSize
ปัญหาใหญ่ที่นี่คือฉลากจะไม่เปลี่ยนความสูงโดยอัตโนมัติ (เฉพาะความกว้าง) เพื่อให้ได้รับสิทธินี้คุณจะต้องซับคลาสของฉลากและรวมตรรกะการปรับขนาดแนวตั้ง
โดยทั่วไปสิ่งที่คุณต้องทำใน OnPaint คือ:
คุณจะต้องตั้งค่าสถานะลักษณะResizeRedrawในตัวสร้าง
ที่จริงแล้วคำตอบที่ยอมรับนั้นซับซ้อนโดยไม่จำเป็น
หากคุณตั้งค่าป้ายกำกับเป็น AutoSize มันจะเติบโตโดยอัตโนมัติพร้อมข้อความที่คุณใส่ไว้ (ซึ่งรวมถึงการเติบโตในแนวดิ่ง)
ถ้าคุณต้องการทำให้เป็นคำที่มีความกว้างเฉพาะคุณสามารถตั้งค่าคุณสมบัติ MaximumSize ได้
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
ผ่านการทดสอบและทำงาน
Dock
คุณสมบัติของทั้งฉลากและพาเนลได้Top
แทนที่จะเป็นโซลูชันของฉัน
OnResize
ผู้ปกครองและโทรmyLabel.MaximumSize = new Size(Bounds.Width, 0);
ในกรณีของฉัน (ป้ายบนแผง) ผมตั้งและlabel.AutoSize = false
label.Dock = Fill
และข้อความฉลากจะถูกห่อโดยอัตโนมัติ
ไม่มีคุณสมบัติ autowrap แต่สามารถทำได้โดยทางโปรแกรมเพื่อกำหนดขนาดแบบไดนามิก นี่คือทางออกหนึ่ง:
เลือกคุณสมบัติของฉลาก
AutoSize
= True
MaximumSize
= ( ความกว้าง , ความสูง ) ที่กว้าง = ขนาดสูงสุดที่คุณต้องการฉลากจะเป็นและความสูง = จำนวนพิกเซลที่คุณต้องการให้ห่อ
จากMSDN , ตัดข้อความในป้ายกำกับโดยอัตโนมัติ :
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;
)
ฉันต้องหาวิธีแก้ปัญหาอย่างรวดเร็วดังนั้นฉันจึงใช้ TextBox กับคุณสมบัติเหล่านั้น:
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
};
ขอให้มีคนที่ดีกว่านี้ตามคำตอบของ @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;
สิ่งนี้ช่วยให้คุณใช้ป้ายกำกับการเติบโตอัตโนมัติเมื่อเทียบกับพาเรนต์เช่นพาเนล
this.Height = sz.Height + Padding.Bottom + Padding.Top;
ที่นี่เราดูแลช่องว่างภายในสำหรับด้านบนและด้านล่าง
จัดการกับClientSizeChanged event
แผงทำให้ฉลากเต็มพื้นที่:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
ตั้งค่าAuto-Size
สำหรับฉลากเป็นtrue
Dock
สำหรับฉลากเป็นFill
ไม่แน่ใจว่ามันจะพอดีกับการใช้งานในทุกกรณี แต่ฉันมักจะใช้เคล็ดลับง่ายๆที่จะได้รับพฤติกรรมการตัด: ใส่ของคุณLabel
ที่มีAutoSize=false
อยู่ภายในขนาด 1x1 TableLayoutPanel
ซึ่งจะดูแลLabel
's ขนาด
หากพาเนลของคุณจำกัดความกว้างของฉลากคุณสามารถตั้งค่าคุณสมบัติ Anchor ของฉลากเป็นซ้าย, ขวาและตั้งค่าขนาดอัตโนมัติเป็นจริง นี่คือแนวคิดคล้ายกับการฟังสำหรับแผงSizeChanged
เหตุการณ์และปรับปรุง MaximumSize ฉลากไปnew Size(((Control)sender).Size.Width, 0)
ตามที่แนะนำโดยคำตอบที่ก่อนหน้านี้ ทุกด้านที่ระบุไว้ในคุณสมบัติ Anchor นั้นดียึดกับด้านในของตัวควบคุมที่มี ดังนั้นการแสดงสองฝั่งตรงข้ามใน Anchor จึงกำหนดขนาดของตัวควบคุมอย่างมีประสิทธิภาพ การยึดกับด้านซ้ายและขวาจะเป็นการตั้งค่าคุณสมบัติความกว้างของตัวควบคุมและการยึดกับด้านบนและด้านล่างจะเป็นการตั้งค่าคุณสมบัติความสูง
วิธีนี้เป็น C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
หากคุณต้องการตั้งค่าความกว้างของฉลากโดยไม่ขึ้นกับเนื้อหาฉันพบว่าวิธีที่ง่ายที่สุดคือ:
ตอนนี้ฉลากมีความกว้างคงที่ แต่ปรับความสูงได้โดยอัตโนมัติ
จากนั้นสำหรับข้อความไดนามิกลดขนาดตัวอักษร หากจำเป็นให้ใช้ตัวอย่างนี้ในส่วนย่อยที่ตั้งค่าข้อความฉลาก:
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
สิ่งนี้ช่วยฉันในรูปแบบของฉันที่ชื่อว่า 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);
}
หากขนาดของปุ่มจะต้องไม่เปลี่ยนแปลง:
myButton.Text = "word\r\nwrapped"
คำตอบง่ายๆสำหรับปัญหานี้คือการเปลี่ยนคุณสมบัติ DOCK ของ Label มันคือ "ไม่มี" โดยค่าเริ่มต้น
หากคุณป้อนข้อความลงในฉลากล่วงหน้าคุณสามารถทำได้
ใช้style="overflow:Scroll"
ในฉลากเช่นเดียวกับใน HTML ด้านล่าง จะเป็นการเพิ่มแถบเลื่อนในฉลากภายในแผงควบคุม
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>