Làm cách nào để giữ nhãn ở giữa trong WinForms?


137

Trong WinFormstôi đang sử dụng Labelđể hiển thị các thông điệp khác nhau như thành công, thất bại, v.v.

Tôi muốn tập trung nhãn đó ở dạng trung tâm. Tôi muốn một giải pháp sẽ giữ nó ở trung tâm cho dù chỉ có một từ hoặc toàn bộ câu trong nhãn.

Câu trả lời:


281

Set Label's AutoSizetài sản để False, TextAligntài sản để MiddleCenterDocktài sản để Fill.


cảm ơn decyclone, nó đã làm việc Bạn có thể hướng dẫn những gì Dock không?
haansi

3
Với thuộc Control.Docktính ( msdn.microsoft.com/en-us/l Library / ' ), bạn có thể gắn (điều khiển) một điều khiển vào một phía nhất định của container. Ví dụ Left, Top, Righthoặc Bottom. Fillnói với điều khiển để lấy tất cả không gian có sẵn trong container.
cơn bão

1
Trừ khi bạn muốn nhãn lấp đầy toàn bộ không gian có sẵn cho nó, bạn có thể muốn đặt thuộc tính Dock thành "Không" theo đề xuất của người dùng3866622 trong giải pháp lập trình của anh ấy / cô ấy.
Tim

3
Đã làm việc, nhưng tôi không cần phải làm gì với Dockcài đặt.
Jim Fell

4
Dockthiết lập là không cần thiết. Thay đổi thuộc AutoSizetính cung cấp cho nhãn một hộp giới hạn mà bạn có thể tự điều chỉnh kích thước.
Nick Roberts

13

Một số nội dung bổ sung nhỏ để cài đặt theo chương trình:

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

Dockstyle và liên kết nội dung có thể khác với nhu cầu của bạn. Ví dụ: đối với nhãn đơn giản trên biểu mẫu wpf, tôi sử dụng DockStyle.None.



10

Nếu bạn không muốn gắn nhãn trong toàn bộ khu vực có sẵn, chỉ cần đặt sự kiện SizeChanged thay vì TextChanged. Thay đổi từng chữ cái sẽ thay đổi thuộc tính chiều rộng của nhãn cũng như văn bản của nó khi tự động hóa thuộc tính được đặt thành True. Vì vậy, bằng cách này, bạn có thể sử dụng bất kỳ công thức nào để giữ nhãn ở giữa.

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

2

Câu trả lời được chấp nhận đã không làm việc cho tôi vì hai lý do:

  1. Tôi đã BackColorthiết lập cài đặt AutoSize = falseDock = Filllàm cho màu nền lấp đầy toàn bộ biểu mẫu
  2. Dù sao tôi cũng không thể AutoSizeđặt thành false vì văn bản nhãn của tôi là động

Thay vào đó, tôi chỉ đơn giản sử dụng chiều rộng của biểu mẫu và chiều rộng của nhãn để tính toán phần bù bên trái:

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

1

Tôi muốn làm một cái gì đó tương tự, nhưng trên một hình thức với một hình ảnh nền, tôi thấy rằng khi văn bản trong nhãn thay đổi, việc lặp lại là rõ ràng với phương pháp này, vì vậy tôi đã làm như sau: * Đặt nhãn AutoSize thành true và TextAlign thành Trung tâm

Sau đó, mỗi lần văn bản thay đổi (tôi đã hoàn thành việc sử dụng bộ đếm thời gian) tôi đã gọi phương thức sau:

    private Point GetPosition()
    {
        int y = (this.Height / 2) - (label1.Height / 2);
        int x = (this.Width / 2) - (label1.Width / 2);
        return new Point(x, y);
    }

Và đặt thuộc tính Vị trí của nhãn thành giá trị trả về này. Điều này đảm bảo rằng nhãn luôn ở giữa biểu mẫu khi văn bản thay đổi và việc sơn lại cho biểu mẫu toàn màn hình không rõ ràng.


1

Bạn có thể thử đoạn mã sau:

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

Đó thực sự là Trung tâm

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.