猿问

WinForms中的水印文本框

WinForms中的水印文本框

有人能告诉我一个基本Windows窗体文本框的良好实现吗?该文本框最初将显示当光标进入时消失的水印文本?我认为我可以通过对Enter和Left事件的一些创造性的使用来创建我自己的东西,但是我确信在某个地方有一个非常有用的实现。我看到了WPF的实现,如果有必要,我可以嵌套它,但是使用原生的WinForms文本框派生会更好。

到目前为止,我还没有试过,但是有没有人看到明显的问题呢?

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功能,但是这个功能非常好。


慕哥6287543
浏览 411回答 3
3回答
随时随地看视频慕课网APP
我要回答