, Прежде всего, убедитесь, что что-то работает, если вы собираетесь опубликовать код для кого-то.

ли кто-нибудь указать мне на хорошую реализацию базового текстового поля 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, но это прекрасно работает.

Ответы на вопрос(7)

Ваш ответ на вопрос