ในขณะที่ใช้EM_SETCUEBANNER
ข้อความนั้นอาจจะง่ายที่สุดสิ่งหนึ่งที่ฉันไม่ชอบคือข้อความตัวยึดจะหายไปเมื่อตัวควบคุมได้รับโฟกัส นั่นเป็นสัตว์เลี้ยงที่ฉุนเฉียวของฉันเมื่อฉันกรอกแบบฟอร์ม ฉันต้องคลิกมันเพื่อจดจำว่าฟิลด์นั้นมีไว้เพื่ออะไร
ดังนั้นนี่เป็นอีกวิธีการหนึ่งสำหรับ WinForms มันซ้อนทับLabel
ด้านบนของตัวควบคุมซึ่งจะหายไปเมื่อผู้ใช้เริ่มพิมพ์
มันไม่ได้เป็นกระสุนอย่างแน่นอน มันรับใด ๆแต่ผมได้ทดสอบเฉพาะกับControl
TextBox
มันอาจต้องมีการดัดแปลงเพื่อให้ทำงานกับส่วนควบคุมได้ เมธอดจะส่งคืนการLabel
ควบคุมในกรณีที่คุณต้องการแก้ไขบิตในกรณีเฉพาะ แต่นั่นอาจไม่จำเป็น
ใช้มันแบบนี้:
SetPlaceholder(txtSearch, "Type what you're searching for");
นี่คือวิธีการ:
/// <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;
}