Embora o uso da EM_SETCUEBANNER
mensagem seja provavelmente mais simples, uma coisa de que não gosto é que o texto do espaço reservado desaparece quando o controle fica em foco. É uma irritação minha quando estou preenchendo formulários. Preciso clicar nele para lembrar para que serve o campo.
Então, aqui está outra solução para o WinForms. Sobrepõe um Label
no topo do controle, que desaparece apenas quando o usuário começa a digitar.
Certamente não é à prova de balas. Ele aceita qualquer Control
, mas eu só testei com a TextBox
. Pode ser necessário modificar para trabalhar com alguns controles. O método retorna o Label
controle caso você precise modificá-lo um pouco em um caso específico, mas isso pode nunca ser necessário.
Use-o assim:
SetPlaceholder(txtSearch, "Type what you're searching for");
Aqui está o método:
/// <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;
}