ในWinForms
ฉันใช้Label
เพื่อแสดงข้อความที่แตกต่างกันเช่นความสำเร็จความล้มเหลว ฯลฯ
ฉันต้องการจัดกึ่งกลางของป้ายกำกับนั้นในรูปแบบกึ่งกลาง ฉันต้องการทางออกที่จะทำให้มันเป็นศูนย์กลางไม่ว่าจะมีเพียงหนึ่งคำหรือทั้งประโยคในฉลาก
ในWinForms
ฉันใช้Label
เพื่อแสดงข้อความที่แตกต่างกันเช่นความสำเร็จความล้มเหลว ฯลฯ
ฉันต้องการจัดกึ่งกลางของป้ายกำกับนั้นในรูปแบบกึ่งกลาง ฉันต้องการทางออกที่จะทำให้มันเป็นศูนย์กลางไม่ว่าจะมีเพียงหนึ่งคำหรือทั้งประโยคในฉลาก
คำตอบ:
ชุดLabel
ของAutoSize
คุณสมบัติการFalse
, TextAlign
คุณสมบัติการMiddleCenter
และคุณสมบัติการDock
Fill
Control.Dock
คุณสมบัติ ( msdn.microsoft.com/en-us/library/… ) คุณสามารถเชื่อมต่อ (ติด) ตัวควบคุมเข้ากับด้านหนึ่งของคอนเทนเนอร์ได้ ตัวอย่างเช่นLeft
, Top
, หรือRight
บอกให้ตัวควบคุมใช้พื้นที่ทั้งหมดที่มีอยู่ในคอนเทนเนอร์ Bottom
Fill
Dock
ตั้งค่า
Dock
การตั้งค่าไม่จำเป็น การเปลี่ยนAutoSize
คุณสมบัติจะให้กล่องขอบป้ายผนึกที่คุณสามารถปรับขนาดด้วยตนเอง
เนื้อหาเพิ่มเติมเล็กน้อยสำหรับการตั้งค่าโดยทางโปรแกรม:
Label textLabel = new Label() {
AutoSize = false,
TextAlign = ContentAlignment.MiddleCenter,
Dock = DockStyle.None,
Left = 10,
Width = myDialog.Width - 10
};
การจัดแนว Dockstyle และเนื้อหาอาจแตกต่างจากความต้องการของคุณ ตัวอย่างเช่นสำหรับฉลากง่าย ๆ ในรูปแบบ wpf ฉันใช้ DockStyle.None
คุณจะได้รับมันด้วยการตั้งค่าคุณสมบัติ Anchor: None
หากคุณไม่ต้องการเชื่อมต่อป้ายกำกับในพื้นที่ที่มีทั้งหมดให้ตั้งค่าเหตุการณ์ SizeChanged แทน TextChanged การเปลี่ยนแปลงตัวอักษรแต่ละตัวจะเปลี่ยนคุณสมบัติความกว้างของฉลากรวมถึงข้อความเมื่อตั้งค่าคุณสมบัติปรับขนาดอัตโนมัติเป็น True ดังนั้นโดยวิธีที่คุณสามารถใช้สูตรใด ๆ เพื่อให้ฉลากอยู่กึ่งกลางในแบบฟอร์ม
private void lblReport_SizeChanged(object sender, EventArgs e)
{
lblReport.Left = (this.ClientSize.Width - lblReport.Size.Width) / 2;
}
คำตอบที่ยอมรับไม่ได้สำหรับฉันด้วยเหตุผลสองประการ:
BackColor
ตั้งค่าไว้แล้วAutoSize = false
และDock = Fill
ทำให้สีพื้นหลังเติมทั้งฟอร์มAutoSize
ตั้งค่าเป็นเท็จได้เนื่องจากข้อความป้ายกำกับของฉันเป็นแบบไดนามิกแต่ฉันใช้ความกว้างของฟอร์มและความกว้างของฉลากแทนการคำนวณออฟเซ็ตซ้าย:
MyLabel.Left = (this.Width - MyLabel.Width) / 2;
ฉันต้องการทำสิ่งที่คล้ายกัน แต่ในรูปแบบที่มีภาพพื้นหลังฉันพบว่าเมื่อข้อความในฉลากเปลี่ยน repaints ชัดเจนด้วยวิธีนี้ดังนั้นฉันทำต่อไปนี้: * ตั้งป้ายกำกับ AutoSize เป็นจริงและ TextAlign เป็น MiddleCenter
จากนั้นทุกครั้งที่ข้อความเปลี่ยนไป (ฉันใช้ตัวจับเวลา) ฉันเรียกวิธีการต่อไปนี้:
private Point GetPosition()
{
int y = (this.Height / 2) - (label1.Height / 2);
int x = (this.Width / 2) - (label1.Width / 2);
return new Point(x, y);
}
และตั้งค่าคุณสมบัติตำแหน่งของป้ายกำกับเป็นค่าส่งคืน สิ่งนี้ทำให้มั่นใจได้ว่าป้ายกำกับนั้นอยู่กึ่งกลางของแบบฟอร์มเสมอเมื่อข้อความเปลี่ยนไปและ repaints สำหรับแบบเต็มหน้าจอไม่ชัดเจน
คุณสามารถลองใช้ข้อมูลโค้ดต่อไปนี้:
private Point CenterOfMenuPanel<T>(T control, int height=0) where T:Control {
Point center = new Point(
MenuPanel.Size.Width / 2 - control.Width * 2,
height != 0 ? height : MenuPanel.Size.Height / 2 - control.Height / 2);
return center;
}
เป็นศูนย์จริงๆ