, Прежде всего, убедитесь, что что-то работает, если вы собираетесь опубликовать код для кого-то.
ли кто-нибудь указать мне на хорошую реализацию базового текстового поля Windows Forms, которое первоначально будет отображать текст водяного знака, который исчезает, когда курсор вводит его? Я думаю, что могу создать свой собственный с некоторым творческим использованием событий Enter и Leave, но я уверен, что где-то где-то есть удобная реализация. Я видел реализацию WPF и при необходимости мог бы ее вкладывать, но лучше было бы использовать производную WinForms TextBox.
У меня есть это до сих пор; еще не пробовал, но кто-нибудь видит какие-либо явные проблемы?
public class WatermarkTextBox:TextBox
{
public string WatermarkText { get; set; }
public Color WatermarkColor { get; set; }
private Color TextColor { get; set; }
private bool isInTransition;
public WatermarkTextBox()
{
WatermarkColor = SystemColors.GrayText;
}
private bool HasText { get { return Text.IsNotNullOrBlankOr(WatermarkText); }}
protected override void OnEnter(EventArgs e)
{
base.OnEnter(e);
if (HasText) return;
isInTransition = true;
ForeColor = TextColor;
Text = String.Empty;
isInTransition = false;
}
protected override void OnForeColorChanged(EventArgs e)
{
base.OnForeColorChanged(e);
if (!isInTransition) //the change came from outside
TextColor = ForeColor;
}
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
if (HasText) return;
isInTransition = true;
ForeColor = WatermarkColor;
Text = WatermarkText.EmptyIfNull();
isInTransition = false;
}
}
РЕДАКТИРОВАТЬ: Выше, в конечном счете, работал бы с некоторым обманом, но CueProvider работал намного лучше. Вот моя последняя реализация:
public class WatermarkTextBox:TextBox
{
private string watermarkText;
public string WatermarkText
{
get { return watermarkText; }
set
{
watermarkText = value;
if (watermarkText.IsNullOrBlank())
CueProvider.ClearCue(this);
else
CueProvider.SetCue(this, watermarkText);
}
}
}
Я мог бы полностью интегрировать функциональность CueProvider, но это прекрасно работает.