Добавление текста-заполнителя в текстовое поле

Я ищу способ добавить текст-заполнитель в текстовое поле, как вы можете с помощью текстового поля в html5.

т.е. если в текстовом поле нет текста, то добавляется текст Enter some text here, когда пользователь нажимает на него, текст-заполнитель исчезает и позволяет пользователю введите собственный текст, и если текстовое поле теряет фокус, а текст по-прежнему отсутствует, заполнитель добавляется обратно в текстовое поле.

113 голосов | спросил Boardy 9 AM00000010000002931 2012, 01:22:29

18 ответов


0

Разве это не было бы что-то вроде этого:

Textbox myTxtbx = new Textbox();
myTxtbx.Text = "Enter text here...";

myTxtbx.GotFocus += GotFocus.EventHandle(RemoveText);
myTxtbx.LostFocus += LostFocus.EventHandle(AddText);

public void RemoveText(object sender, EventArgs e)
{
    myTxtbx.Text = "";
}

public void AddText(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(myTxtbx.Text))
        myTxtbx.Text = "Enter text here...";
}

Это просто псевдокод, но концепция есть.

ответил ExceptionLimeCat 9 AM00000010000000331 2012, 01:34:03
0

Вместо того, чтобы обрабатывать события ввода и выхода фокуса для установки и удаления текста заполнителя, можно использовать функцию SendMessage Windows для отправки EM_SETCUEBANNER сообщение в наше текстовое поле, чтобы сделать работу за нас.

Это можно сделать двумя простыми шагами. Для начала нам нужно показать функцию Windows SendMessage.

private const int EM_SETCUEBANNER = 0x1501;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SendMessage(IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)]string lParam);

Затем просто вызовите метод с дескриптором нашего текстового поля, значением EM_SETCUEBANNER и текстом, который мы хотим установить.

SendMessage(textBox1.Handle, EM_SETCUEBANNER, 0, "Username");
SendMessage(textBox2.Handle, EM_SETCUEBANNER, 0, "Password");

Ссылка: Установить текст заполнителя для текстового поля текст)

ответил Abdullah Qudeer 14 MarpmFri, 14 Mar 2014 16:49:53 +04002014-03-14T16:49:53+04:0004 2014, 16:49:53
0

Добавьте этот класс в свой проект и постройте свое решение. Нажмите на Toolbox в visual studio, вы увидите новый компонент текстового поля с именем PlaceholderTextBox. Удалите текущее текстовое поле в дизайне формы и замените его PlaceHolderTextBox.

 введите описание изображения здесь

PlaceHolderTextBox имеет свойство PlaceHolderText. Установите любой текст, который вы хотите, и хорошего дня :)

public class PlaceHolderTextBox : TextBox
{

    bool isPlaceHolder = true;
    string _placeHolderText;
    public string PlaceHolderText
    {
        get { return _placeHolderText; }
        set
        {
            _placeHolderText = value;
            setPlaceholder();
        }
    }

    public new string Text
    {
        get => isPlaceHolder ? string.Empty : base.Text;
        set => base.Text = value;
    }

    //when the control loses focus, the placeholder is shown
    private void setPlaceholder()
    {
        if (string.IsNullOrEmpty(base.Text))
        {
            base.Text = PlaceHolderText;
            this.ForeColor = Color.Gray;
            this.Font = new Font(this.Font, FontStyle.Italic);
            isPlaceHolder = true;
        }
    }

    //when the control is focused, the placeholder is removed
    private void removePlaceHolder()
    {

        if (isPlaceHolder)
        {
            base.Text = "";
            this.ForeColor = System.Drawing.SystemColors.WindowText;
            this.Font = new Font(this.Font, FontStyle.Regular);
            isPlaceHolder = false;
        }
    }
    public PlaceHolderTextBox()
    {
        GotFocus += removePlaceHolder;
        LostFocus += setPlaceholder;
    }

    private void setPlaceholder(object sender, EventArgs e)
    {
        setPlaceholder();
    }

    private void removePlaceHolder(object sender, EventArgs e)
    {
        removePlaceHolder();
    }
}
ответил Kemal Karadag 18 Mayam16 2016, 10:11:52
0

Это не мой код, но я часто его использую, и он отлично работает ... ТОЛЬКО XAML

<TextBox x:Name="Textbox" Height="23" Margin="0,17,18.8,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" HorizontalAlignment="Right" ></TextBox>

<TextBlock x:Name="Placeholder" IsHitTestVisible="False" TextWrapping="Wrap" Text="Placeholder Text" VerticalAlignment="Top" Margin="0,20,298.8,0" Foreground="DarkGray" HorizontalAlignment="Right" Width="214">
  <TextBlock.Style>
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="Visibility" Value="Collapsed"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding Text, ElementName=Textbox}" Value="">
          <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>
ответил Jaun Lloyd 29 +03002015-10-29T12:38:16+03:00312015bEurope/MoscowThu, 29 Oct 2015 12:38:16 +0300 2015, 12:38:16
0

Прикрепленные свойства для спасения:

public static class TextboxExtensions
{
    public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.RegisterAttached(
        "Placeholder", typeof(string), typeof(TextboxExtensions), new PropertyMetadata(default(string), propertyChangedCallback: PlaceholderChanged));

    private static void PlaceholderChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
    {
        var tb = dependencyObject as TextBox;
        if(tb == null)
            return;

        tb.LostFocus -= OnLostFocus;
        tb.GotFocus -= OnGotFocus;

        if (args.NewValue != null)
        {
            tb.GotFocus += OnGotFocus;
            tb.LostFocus += OnLostFocus;
        }
    }

    private static void OnLostFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        var tb = sender as TextBox;
        if (string.IsNullOrEmpty(tb.Text) || string.IsNullOrWhiteSpace(tb.Text))
        {
            tb.Text = GetPlaceholder(tb);
        }
    }

    private static void OnGotFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        var tb = sender as TextBox;
        var ph = GetPlaceholder(tb);
        if (tb.Text == ph)
        {
            tb.Text = string.Empty;
        }
    }

    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static void SetPlaceholder(DependencyObject element, string value)
    {
        element.SetValue(PlaceholderProperty, value);
    }

    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static string GetPlaceholder(DependencyObject element)
    {
        return (string) element.GetValue(PlaceholderProperty);
    }
}

Использование:

<TextBox Text="hi" local:TextboxExtensions.Placeholder="Hello there"></TextBox>
ответил Dbl 28 PMpThu, 28 Apr 2016 12:00:55 +030000Thursday 2016, 12:00:55
0

Хотя использование сообщения EM_SETCUEBANNER, вероятно, самое простое, мне не нравится то, что текст-заполнитель исчезает, когда элемент управления получает фокус , Это моя любимая мозоль, когда я заполняю формы. Я должен нажать на нее, чтобы вспомнить, для чего это поле.

Итак, вот еще одно решение для WinForms. Он перекрывает Label поверх элемента управления, который исчезает только тогда, когда пользователь начинает печатать.

Это, конечно, не пуленепробиваемый. Он принимает любые Control, но я тестировал только с TextBox. Может потребоваться модификация для работы с некоторыми элементами управления. Метод возвращает элемент управления Label в случае, если вам нужно немного изменить его в конкретном случае, но это может никогда не понадобиться.

Используйте это так:

SetPlaceholder(txtSearch, "Type what you're searching for");

Вот метод:

/// <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;
}
ответил Gabriel Luci 12 MonEurope/Moscow2016-12-12T20:05:49+03:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2016 20:05:49 +0300 2016, 20:05:49
0

Вы можете получить Template , измените его, наложив TextBlock, и используйте Style для добавления триггеров, которые скрывают и показывают его в нужных состояниях.

ответил H.B. 9 AM00000020000001931 2012, 02:02:19
0

Это будет означать, что у вас есть кнопка, позволяющая выполнить действие, например, войти в систему или что-то еще. Перед выполнением действия вы проверяете, заполнено ли текстовое поле. Если нет, оно заменит текст

 private void button_Click(object sender, EventArgs e)
 {
     string textBoxText = textBox.Text;

     if (String.IsNullOrWhiteSpace(textBoxText))
     {
         textBox.Text = "Fill in the textbox";
     }
 }

 private void textBox_Enter(object sender, EventArgs e)
 {
     TextBox currentTextbox = sender as TextBox;
     if (currentTextbox.Text == "Fill in the textbox")
     {
         currentTextbox.Text = "";
     }
 }

Это немного глупо, но проверять текст на предмет значения, которое вы даете, это лучшее, что я могу сделать, а не так хорошо в c #, чтобы найти лучшее решение.

ответил VJamie 20 FebruaryEurope/MoscowbFri, 20 Feb 2015 11:07:27 +0300000000amFri, 20 Feb 2015 11:07:27 +030015 2015, 11:07:27
0

На основании ответа ExceptionLimeCat, улучшение:

Color farbe;
string ph = "Placeholder-Text";

private void Form1_Load(object sender, EventArgs e)
{
    farbe = myTxtbx.ForeColor;
    myTxtbx.GotFocus += RemoveText;
    myTxtbx.LostFocus += AddText;
    myTxtbx.Text = ph;
}


public void RemoveText(object sender, EventArgs e)
{
    myTxtbx.ForeColor = farbe;
    if (myTxtbx.Text == ph)
        myTxtbx.Text = "";
}

public void AddText(object sender, EventArgs e)
{
    if (String.IsNullOrWhiteSpace(myTxtbx.Text))
    {
        myTxtbx.ForeColor = Color.Gray;
        myTxtbx.Text = ph;
    }
}
ответил Vitalis Hommel 11 J0000006Europe/Moscow 2016, 13:27:50
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace App_name
{
   public class CustomTextBox : TextBox
    {
        private string Text_ = "";
        public CustomTextBox() : base()
        {}

        public string setHint
        {
            get { return Text_; }
            set { Text_ = value; }
        }
        protected override void OnGotFocus(RoutedEventArgs e)
        {
            base.OnGotFocus(e);
            if (Text_.Equals(this.Text))
                this.Clear();
        }
        protected override void OnLostFocus(RoutedEventArgs e)
        {
            base.OnLostFocus(e);
            if (String.IsNullOrWhiteSpace(this.Text))
                this.Text = Text_;
        }
    }
}
>    xmlns:local="clr-namespace:app_name"
>  <local:CustomTextBox
>                 x:Name="id_number_txt"
>                 Width="240px"
>                 Height="auto"/>
ответил Saef Myth 7 Jpm1000000pmSat, 07 Jan 2017 12:42:42 +030017 2017, 12:42:42
0

Вот и я с этим решением, вдохновленным @Kemal Karadag.

Я заметил, что каждое опубликованное решение основано на фокусе,

Хотя я хотел, чтобы моим заполнителем был точный клон стандартного заполнителя HTML в Google Chrome.

Вместо того, чтобы скрывать /показывать заполнитель, когда окно сфокусировано,

Я скрываю /показываю заполнитель в зависимости от длины текста в поле:

Если поле пустое, отображается местозаполнитель, а при вводе в поле заполнитель исчезает.

Поскольку он унаследован от стандартного TextBox, вы можете найти его в вашей панели инструментов!

using System;
using System.Drawing;
using System.Windows.Forms;

public class PlaceHolderTextBox : TextBox
{
    private bool isPlaceHolder = true;
    private string placeHolderText;

    public string PlaceHolderText
    {
        get { return placeHolderText; }
        set
        {
            placeHolderText = value;
            SetPlaceholder();
        }
    }

    public PlaceHolderTextBox()
    {
        TextChanged += OnTextChanged;
    }

    private void SetPlaceholder()
    {
        if (!isPlaceHolder)
        {
            this.Text = placeHolderText;
            this.ForeColor = Color.Gray;
            isPlaceHolder = true;
        }
    }

    private void RemovePlaceHolder()
    {
        if (isPlaceHolder)
        {
            this.Text = this.Text[0].ToString(); // Remove placeHolder text, but keep the character we just entered
            this.Select(1, 0); // Place the caret after the character we just entered
            this.ForeColor = System.Drawing.SystemColors.WindowText;
            isPlaceHolder = false;
        }
    }

    private void OnTextChanged(object sender, EventArgs e)
    {
        if (this.Text.Length == 0)
        {
            SetPlaceholder();
        }
        else
        {
            RemovePlaceHolder();
        }
    }
}
ответил Eldoïr 10 52017vEurope/Moscow11bEurope/MoscowFri, 10 Nov 2017 14:22:45 +0300 2017, 14:22:45
0

Попробуйте следующий код:

<TextBox x:Name="InvoiceDate" Text="" Width="300"  TextAlignment="Left" Height="30" Grid.Row="0" Grid.Column="3" Grid.ColumnSpan="2" />
                    <TextBlock IsHitTestVisible="False" Text="Men att läsa" Width="300"  TextAlignment="Left" Height="30" Grid.Row="0" Grid.Column="3" Grid.ColumnSpan="2" Padding="5, 5, 5, 5"  Foreground="LightGray">
                        <TextBlock.Style>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="Visibility" Value="Collapsed"/>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Text, ElementName=InvoiceDate}" Value="">
                                        <Setter Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding ElementName=InvoiceDate, Path=IsFocused}" Value="True">
                                        <Setter Property="Visibility" Value="Collapsed"/>
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
ответил Nalan Madheswaran 18 22014vEurope/Moscow11bEurope/MoscowTue, 18 Nov 2014 18:20:04 +0300 2014, 18:20:04
0

вы также можете сделать это, если щелкнуть мышью, предположим, что ваш заполнитель текста "User_Name"

 private void textBox1_MouseClick(object sender, MouseEventArgs e)
 {
     if(textBox1.Text == "User_Name")
          textBox1.Text = "";
 }
ответил Adiii 31 Jam1000000amSat, 31 Jan 2015 08:49:07 +030015 2015, 08:49:07
0
    public void Initialize()
    {
        SetPlaceHolder(loginTextBox, " Логин ");
        SetPlaceHolder(passwordTextBox, " Пароль ");
    }

    public void SetPlaceHolder(Control control, string PlaceHolderText)
    {
        control.Text = PlaceHolderText;
        control.GotFocus += delegate(object sender, EventArgs args) {
            if (control.Text == PlaceHolderText)
            {
                control.Text = "";
            }
        };
        control.LostFocus += delegate(object sender, EventArgs args){
            if (control.Text.Length == 0)
            {
                control.Text = PlaceHolderText;
            }
        };
    }
ответил igorpauk 15 Jam1000000amFri, 15 Jan 2016 09:02:50 +030016 2016, 09:02:50
0

Вместо того чтобы использовать свойство .Text TextBox, я наложил TextBlock с помощью заполнителя. Я не смог использовать свойство .Text, потому что оно было привязано к событию.

XAML:

<Canvas Name="placeHolderCanvas">
    <TextBox  AcceptsReturn="True" Name="txtAddress" Height="50" Width="{Binding ActualWidth, ElementName=placeHolderCanvas}"
              Tag="Please enter your address"/>
</Canvas>

VB.NET

Public Shared Sub InitPlaceholder(canvas As Canvas)
    Dim txt As TextBox = canvas.Children.OfType(Of TextBox).First()
    Dim placeHolderLabel = New TextBlock() With {.Text = txt.Tag,
                                                 .Foreground = New SolidColorBrush(Color.FromRgb(&H77, &H77, &H77)),
                                                 .IsHitTestVisible = False}
    Canvas.SetLeft(placeHolderLabel, 3)
    Canvas.SetTop(placeHolderLabel, 1)
    canvas.Children.Add(placeHolderLabel)
    AddHandler txt.TextChanged, Sub() placeHolderLabel.Visibility = If(txt.Text = "", Visibility.Visible, Visibility.Hidden)
End Sub

Результат: введите описание изображения здесь

ответил andy 18 PM00000030000001231 2016, 15:54:12
0

Вы также можете попробовать это таким образом ..

вызвать функцию

TextboxPlaceHolder(this.textBox1, "YourPlaceHolder");

напишите эту функцию

private void TextboxPlaceHolder(Control control, string PlaceHolderText)
{
        control.Text = PlaceHolderText;
        control.GotFocus += delegate (object sender, EventArgs args)
        {
            if (cusmode == false)
            {
                control.Text = control.Text == PlaceHolderText ? string.Empty : control.Text;
                //IF Focus TextBox forecolor Black
                control.ForeColor = Color.Black;
            }
        };

        control.LostFocus += delegate (object sender, EventArgs args)
        {
            if (string.IsNullOrWhiteSpace(control.Text) == true)
            {
                control.Text = PlaceHolderText;
                //If not focus TextBox forecolor to gray
                control.ForeColor = Color.Gray;
            }

        };
}
ответил Ramgy Borja 31 J000000Monday17 2017, 07:54:31
0

есть ЛУЧШИЕ решения, но самое простое решение здесь: установить текстовое поле для желаемой строки затем создайте функцию, которая удаляет текст, включите эту функцию в текстовом поле «Focus Enter event»

ответил Ja Austin 24 J000000Tuesday18 2018, 02:24:08
0

Очень эффективное решение здесь для элемента управления TextForox в WindowsForms. (не уверен насчет XAML).

Это также будет работать в режиме Multliline.

Возможно, он может быть расширен для других элементов управления, например, для элемента управления ComboBox (не проверено)

ответил Anton Norko 30 PM00000020000000031 2018, 14:41:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132