ฉันจะทำให้ฉลากอยู่กึ่งกลางใน WinForms ได้อย่างไร


137

ในWinFormsฉันใช้Labelเพื่อแสดงข้อความที่แตกต่างกันเช่นความสำเร็จความล้มเหลว ฯลฯ

ฉันต้องการจัดกึ่งกลางของป้ายกำกับนั้นในรูปแบบกึ่งกลาง ฉันต้องการทางออกที่จะทำให้มันเป็นศูนย์กลางไม่ว่าจะมีเพียงหนึ่งคำหรือทั้งประโยคในฉลาก

คำตอบ:


281

ชุดLabelของAutoSizeคุณสมบัติการFalse, TextAlignคุณสมบัติการMiddleCenterและคุณสมบัติการDockFill


ขอบคุณพายุไซโคลนมันทำงานได้ คุณสามารถให้คำแนะนำว่า Dock ทำอะไรได้บ้าง?
haansi

3
ด้วยControl.Dockคุณสมบัติ ( msdn.microsoft.com/en-us/library/… ) คุณสามารถเชื่อมต่อ (ติด) ตัวควบคุมเข้ากับด้านหนึ่งของคอนเทนเนอร์ได้ ตัวอย่างเช่นLeft, Top, หรือRight บอกให้ตัวควบคุมใช้พื้นที่ทั้งหมดที่มีอยู่ในคอนเทนเนอร์ BottomFill
decyclone

1
หากคุณไม่ต้องการให้ฉลากเติมเต็มพื้นที่ว่างคุณอาจต้องการตั้งค่าคุณสมบัติ Dock เป็น "None" ตามที่ผู้ใช้แนะนำ 3866622 ในโซลูชันแบบเป็นโปรแกรมของเขา / เธอ
ทิม

3
ใช้งานได้ แต่ฉันไม่จำเป็นต้องทำอะไรกับการDockตั้งค่า
Jim Fell

4
Dockการตั้งค่าไม่จำเป็น การเปลี่ยนAutoSizeคุณสมบัติจะให้กล่องขอบป้ายผนึกที่คุณสามารถปรับขนาดด้วยตนเอง
Nick Roberts

13

เนื้อหาเพิ่มเติมเล็กน้อยสำหรับการตั้งค่าโดยทางโปรแกรม:

Label textLabel = new Label() { 
        AutoSize = false, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Dock = DockStyle.None, 
        Left = 10, 
        Width = myDialog.Width - 10
};            

การจัดแนว Dockstyle และเนื้อหาอาจแตกต่างจากความต้องการของคุณ ตัวอย่างเช่นสำหรับฉลากง่าย ๆ ในรูปแบบ wpf ฉันใช้ DockStyle.None



10

หากคุณไม่ต้องการเชื่อมต่อป้ายกำกับในพื้นที่ที่มีทั้งหมดให้ตั้งค่าเหตุการณ์ SizeChanged แทน TextChanged การเปลี่ยนแปลงตัวอักษรแต่ละตัวจะเปลี่ยนคุณสมบัติความกว้างของฉลากรวมถึงข้อความเมื่อตั้งค่าคุณสมบัติปรับขนาดอัตโนมัติเป็น True ดังนั้นโดยวิธีที่คุณสามารถใช้สูตรใด ๆ เพื่อให้ฉลากอยู่กึ่งกลางในแบบฟอร์ม

private void lblReport_SizeChanged(object sender, EventArgs e)
{
    lblReport.Left = (this.ClientSize.Width - lblReport.Size.Width) / 2;
}

2

คำตอบที่ยอมรับไม่ได้สำหรับฉันด้วยเหตุผลสองประการ:

  1. ฉันBackColorตั้งค่าไว้แล้วAutoSize = falseและDock = Fillทำให้สีพื้นหลังเติมทั้งฟอร์ม
  2. ฉันไม่สามารถAutoSizeตั้งค่าเป็นเท็จได้เนื่องจากข้อความป้ายกำกับของฉันเป็นแบบไดนามิก

แต่ฉันใช้ความกว้างของฟอร์มและความกว้างของฉลากแทนการคำนวณออฟเซ็ตซ้าย:

MyLabel.Left = (this.Width - MyLabel.Width) / 2;

1

ฉันต้องการทำสิ่งที่คล้ายกัน แต่ในรูปแบบที่มีภาพพื้นหลังฉันพบว่าเมื่อข้อความในฉลากเปลี่ยน 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 สำหรับแบบเต็มหน้าจอไม่ชัดเจน


1

คุณสามารถลองใช้ข้อมูลโค้ดต่อไปนี้:

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

เป็นศูนย์จริงๆ

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.