Watermark TextBox in WinForms

前端 未结 10 1994
说谎
说谎 2020-11-22 00:35

Can anyone point me to a good implementation of a basic Windows Forms TextBox that will initially show watermark text that disappears when the cursor enters it? I think I ca

10条回答
  •  耶瑟儿~
    2020-11-22 01:19

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace PlaceHolderTextBoxCSharp
    {
        public class CTextBox : TextBox
        {
            private Panel contenedor;
            protected string texto = "PlaceHolderText";
            protected Color colorTextoDefault = Color.Gray;
            public Color colorTexto = Color.Gray;
            protected Color colorTextoObligatorio = Color.Red;
            private Font fuente;
            private SolidBrush establecerColorTexto;
            private bool obligatoriedad = false;
            private bool colorConFoco = false;
            private int vuelta = 0;
    
            public CTextBox()
            {
                Inicializar();
            }
    
            private void Inicializar()
            {
                fuente = Font;
                CharacterCasing = CharacterCasing.Upper;
                contenedor = null;
    
                MuestraPlaceHolder();
    
                Leave += new EventHandler(PierdeFoco);
                TextChanged += new EventHandler(CambiaTexto);
            }
    
            private void EliminaPlaceHolder()
            {
                if (contenedor != null)
                {
                    Controls.Remove(contenedor);
                    contenedor = null;
                }
            }
    
            private void MuestraPlaceHolder()
            {
                if (contenedor == null && TextLength <= 0)
                {
                    contenedor = new Panel();
                    contenedor.Paint += new PaintEventHandler(contenedorPaint);
                    contenedor.Invalidate();
                    contenedor.Click += new EventHandler(contenedorClick);
                    Controls.Add(contenedor);
                }
            }
    
            private void contenedorClick(object sender, EventArgs e)
            {
                Focus();
            }
    
            private void contenedorPaint(object sender, PaintEventArgs e)
            {
                contenedor.Location = new Point(2, 0);
                contenedor.Height = Height;
                contenedor.Width = Width;
                contenedor.Anchor = AnchorStyles.Left | AnchorStyles.Right;
                establecerColorTexto = new SolidBrush(colorTexto);
                Graphics g = e.Graphics;
                g.DrawString(texto, fuente, establecerColorTexto, new PointF(-1f, 1f));
            }
    
            private void PierdeFoco(object sender, EventArgs e)
            {
                if (TextLength > 0)
                {
                    EliminaPlaceHolder();
                }
                else
                {
                    if (obligatoriedad == true)
                    {
                        colorTexto = colorTextoObligatorio;
                    }
                    else
                    {
                        colorTexto = colorTextoDefault;
                    }
    
                    Invalidate();
                }
            }
    
            private void CambiaTexto(object sender, EventArgs e)
            {
                if (TextLength > 0)
                {
                    EliminaPlaceHolder();
                }
                else
                {
                    MuestraPlaceHolder();
    
                    vuelta += 1;
    
                    if (vuelta >= 1 && obligatoriedad == true)
                    {
                        colorTexto = colorTextoObligatorio;
                    }
                }
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                MuestraPlaceHolder();
            }
    
            protected override void OnInvalidated(InvalidateEventArgs e)
            {
                base.OnInvalidated(e);
    
                if (contenedor != null)
                {
                    contenedor.Invalidate();
                }
            }
    
            [Category("Atributos PlaceHolder")]
            [Description("Establece el texto a mostrar.")]
    
            public string PlaceHolderText
            {
                get
                {
                    return texto;
                }
                set
                {
                    texto = value;
                    Invalidate();
                }
            }
    
            [Category("Atributos PlaceHolder")]
            [Description("Establece el estilo de fuente del PlaceHolder.")]
    
            public Font PlaceHolderFont
            {
                get
                {
                    return fuente;
                }
                set
                {
                    fuente = value;
                    Invalidate();
                }
            }
    
            [Category("Atributos PlaceHolder")]
            [Description("Indica si el campo es obligatorio.")]
    
            public bool PlaceHolderFieldRequired
            {
                get
                {
                    return obligatoriedad;
                }
                set
                {
                    obligatoriedad = value;
                    Invalidate();
                }
            }
        }
    }
    

提交回复
热议问题