Mặc dù sử dụng EM_SETCUEBANNER
tin nhắn có lẽ là đơn giản nhất, nhưng một điều tôi không thích là văn bản giữ chỗ sẽ biến mất khi điều khiển được lấy nét. Đó là một tiểu thú cưng của tôi khi tôi điền vào mẫu đơn. Tôi phải bấm vào nó để nhớ trường này dùng để làm gì.
Vì vậy, đây là một giải pháp khác cho WinForms. Nó phủ Label
lên trên đỉnh của điều khiển, nó chỉ biến mất khi người dùng bắt đầu gõ.
Nó chắc chắn không chống đạn. Nó chấp nhận bất kỳ Control
, nhưng tôi chỉ thử nghiệm với a TextBox
. Nó có thể cần sửa đổi để làm việc với một số điều khiển. Phương thức trả về Label
điều khiển trong trường hợp bạn cần sửa đổi nó một chút trong trường hợp cụ thể, nhưng điều đó có thể không bao giờ cần thiết.
Sử dụng nó như thế này:
SetPlaceholder(txtSearch, "Type what you're searching for");
Đây là phương pháp:
/// <summary>
/// Sets placeholder text on a control (may not work for some controls)
/// </summary>
/// <param name="control">The control to set the placeholder on</param>
/// <param name="text">The text to display as the placeholder</param>
/// <returns>The newly-created placeholder Label</returns>
public static Label SetPlaceholder(Control control, string text) {
var placeholder = new Label {
Text = text,
Font = control.Font,
ForeColor = Color.Gray,
BackColor = Color.Transparent,
Cursor = Cursors.IBeam,
Margin = Padding.Empty,
//get rid of the left margin that all labels have
FlatStyle = FlatStyle.System,
AutoSize = false,
//Leave 1px on the left so we can see the blinking cursor
Size = new Size(control.Size.Width - 1, control.Size.Height),
Location = new Point(control.Location.X + 1, control.Location.Y)
};
//when clicking on the label, pass focus to the control
placeholder.Click += (sender, args) => { control.Focus(); };
//disappear when the user starts typing
control.TextChanged += (sender, args) => {
placeholder.Visible = string.IsNullOrEmpty(control.Text);
};
//stay the same size/location as the control
EventHandler updateSize = (sender, args) => {
placeholder.Location = new Point(control.Location.X + 1, control.Location.Y);
placeholder.Size = new Size(control.Size.Width - 1, control.Size.Height);
};
control.SizeChanged += updateSize;
control.LocationChanged += updateSize;
control.Parent.Controls.Add(placeholder);
placeholder.BringToFront();
return placeholder;
}