Adding placeholder text to textbox Adding placeholder text to textbox wpf wpf

Adding placeholder text to textbox


Wouldn't that just be something like this:

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){    if (myTxtbx.Text == "Enter text here...")     {     myTxtbx.Text = "";    }}public void AddText(object sender, EventArgs e){    if (string.IsNullOrWhiteSpace(myTxtbx.Text))        myTxtbx.Text = "Enter text here...";}

Thats just pseudocode but the concept is there.


You can use this, it's working for me and is extremely simple solution.

    <Style x:Key="placeHolder" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type TextBox}">                    <Grid>                        <TextBox Text="{Binding Path=Text,                                                RelativeSource={RelativeSource TemplatedParent},                                                 Mode=TwoWay,                                                UpdateSourceTrigger=PropertyChanged}"                                 x:Name="textSource"                                  Background="Transparent"                                  Panel.ZIndex="2" />                        <TextBox Text="{TemplateBinding Tag}" Background="{TemplateBinding Background}" Panel.ZIndex="1">                            <TextBox.Style>                                <Style TargetType="{x:Type TextBox}">                                    <Setter Property="Foreground" Value="Transparent"/>                                    <Style.Triggers>                                        <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">                                            <Setter Property="Foreground" Value="LightGray"/>                                        </DataTrigger>                                    </Style.Triggers>                                </Style>                            </TextBox.Style>                        </TextBox>                    </Grid>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style>

Usage:

<TextBox Style="{StaticResource placeHolder}" Tag="Name of customer" Width="150" Height="24"/>

‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎


Instead of handling the focus enter and focus leave events in order to set and remove the placeholder text it is possible to use the Windows SendMessage function to send EM_SETCUEBANNER message to our textbox to do the work for us.

This can be done with two easy steps. First we need to expose the Windows SendMessage function.

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);

Then simply call the method with the handle of our textbox, EM_SETCUEBANNER’s value and the text we want to set.

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

Reference: Set placeholder text for textbox (cue text)