Während die Verwendung der EM_SETCUEBANNER
Nachricht wahrscheinlich am einfachsten ist, gefällt mir nicht, dass der Platzhaltertext verschwindet, wenn das Steuerelement den Fokus erhält. Das ist ein kleiner Ärger von mir, wenn ich Formulare ausfülle. Ich muss darauf klicken, um mich daran zu erinnern, wofür das Feld ist.
Hier ist eine weitere Lösung für WinForms. Es überlagert ein Label
Steuerelement, das erst verschwindet, wenn der Benutzer mit der Eingabe beginnt.
Es ist sicherlich nicht kugelsicher. Es akzeptiert keine Control
, aber ich habe nur mit einem getestet TextBox
. Möglicherweise müssen Änderungen vorgenommen werden, um mit einigen Steuerelementen zu arbeiten. Die Methode gibt das Label
Steuerelement zurück, falls Sie es in einem bestimmten Fall ein wenig ändern müssen, dies wird jedoch möglicherweise nie benötigt.
Verwenden Sie es so:
SetPlaceholder(txtSearch, "Type what you're searching for");
Hier ist die Methode:
/// <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;
}