Durante l'utilizzo di EM_SETCUEBANNER
messaggio è probabilmente più semplice, una cosa che non mi piace è che il testo segnaposto scompare quando il controllo viene attivato. Questa è una mia piccola pipì quando compilo i moduli. Devo selezionarlo per ricordare a cosa serve il campo.
Quindi ecco un'altra soluzione per WinForms. Si sovrappone Label
a sopra il controllo, che scompare solo quando l'utente inizia a digitare.
Non è certo a prova di proiettile. Accetta qualsiasi Control
, ma ho provato solo con a TextBox
. Potrebbe essere necessario apportare modifiche per funzionare con alcuni controlli. Il metodo restituisce il Label
controllo nel caso in cui sia necessario modificarlo un po 'in un caso specifico, ma potrebbe non essere mai necessario.
Usalo in questo modo:
SetPlaceholder(txtSearch, "Type what you're searching for");
Ecco il metodo:
/// <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;
}