Menambahkan teks placeholder ke kotak teks

147

Saya mencari cara untuk menambahkan teks placeholder ke kotak teks seperti Anda bisa dengan kotak teks di html5.

Yaitu jika kotak teks tidak memiliki teks, maka itu menambahkan teks Enter some text here, ketika pengguna mengkliknya teks placeholder menghilang dan memungkinkan pengguna untuk memasukkan teks mereka sendiri, dan jika kotak teks kehilangan fokus dan masih ada teks maka placeholder adalah ditambahkan kembali ke kotak teks.

Boardy
sumber
4
Jangan gunakan properti Teks untuk teks placeholder. Ini akan mengganggu ikatan. Gunakan AdornerDecorator ( msdn.microsoft.com/en-us/library/… )
Pavel Voronin
5
Hanya sebuah FYI - Tanda air alias teks petunjuk alias teks placeholder alias spanduk isyarat . Semua istilah ini memiliki maksud yang sama.
RBT

Jawaban:

91

Bukankah itu hanya sesuatu seperti ini:

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...";
}

Itu hanya pseudocode tetapi konsepnya ada di sana.

ExceptionLimeCat
sumber
Terima kasih saya berharap ada semacam XAML yang dapat digunakan untuk membuat placeholder. Terima kasih atas bantuan Anda
Boardy
1
Saya berharap menemukan solusi yang akan menyimpan teks placeholder di kotak teks sampai pengguna memasukkan teks. Sepertinya itu akan bekerja lebih baik.
DROP TABLE pengguna
6
Ini akan bekerja TETAPI jika nilai kotak teks terikat ke sumber maka Anda mungkin memiliki masalah.
Pavel Voronin
1
Ini adalah solusi sederhana yang baik, satu-satunya hal adalah bahwa bahkan setelah memasukkan teks, jika pengguna kembali mengklik pada kotak teks (misalnya untuk menambahkan lebih banyak teks atau menghapus beberapa karakter) seluruh kotak teks akan kehilangan nilai yang dimasukkan
Bibaswann Bandyopadhyay
2
RemoveTextdan AddTextmetode harus public void, hilang batal . Dan seperti yang dikatakan @BibaswannBandyopadhyay, RemoveTextmetodenya bisa seperti ini:if (myTxtbx.Text == "Enter text here...") {myTxtbx.Text = "";}
KaKa
91

Anda dapat menggunakan ini, ini berfungsi untuk saya dan merupakan solusi yang sangat sederhana.

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

Pemakaian:

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

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

MacGile
sumber
1
Hai @ MacGile, saya memodifikasi solusi hebat Anda, karena saya perlu dua cara mengikat antara properti teks asli dan properti textSource.Text.
Gábor Plesz
1
@Rob memasukkannya ke kamus sumber daya. Window.Rumberdaya, dll.
Brian
6
Untuk masalah fokus, tambahkan ini: <ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="FocusManager.FocusedElement" TargetName="textSource" Value="{Binding RelativeSource={RelativeSource Self}}" /> </Trigger> </ControlTemplate.Triggers>
Cihan Yakar
1
Saya akan TextWrapping="wrap"menempel pada kedua tag TextBox di Style, jika Anda ingin melakukan TextBox multi-line dengan teks Placeholder seperti yang saya lakukan.
jpcguy89
1
@Sachin Saya telah memperbaiki properti MaxLenght saya. Masalahnya adalah bahwa satu kotak teks diganti dengan 2 kotak teks. Satu untuk input dan satu untuk placeholder. Untuk memperbaiki rusak properti Anda hanya perlu menambahkan mereka ke textbox pertama seperti ini: <TextBox Text="{Binding Path=Text, RelativeSource=RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="textSource" Background="Transparent" Panel.ZIndex="2" MaxLength="{TemplateBinding MaxLength}" />. Dalam kasus Anda, Anda mungkin perlu menambahkanAcceptsReturn="{TemplateBinding AcceptsReturn}"
ColmanJ
47

Alih-alih menangani fokus masuk dan meninggalkan acara untuk mengatur dan menghapus teks placeholder, dimungkinkan untuk menggunakan fungsi Windows SendMessage untuk mengirim EM_SETCUEBANNERpesan ke kotak teks kami untuk melakukan pekerjaan untuk kami.

Ini bisa dilakukan dengan dua langkah mudah. Pertama kita perlu mengekspos SendMessagefungsi Windows .

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

Kemudian cukup panggil metode dengan pegangan kotak teks kami, nilai EM_SETCUEBANNER dan teks yang ingin kami atur.

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

Referensi: Tetapkan teks placeholder untuk kotak teks (teks isyarat)

Abdullah Qudeer
sumber
10
Catatan: ini tidak berfungsi untuk WPF . Lihat: stackoverflow.com/questions/5054872/…
ArtOfCode
Jawaban terbaik di sini, tetapi perhatikan Form_Load terlalu dini, saya harus menunggu sampai Form_Shown sebelum berfungsi.
Jay Croghan
Satu-satunya hal yang saya benci tentang ini adalah bahwa teks menghilang segera setelah kontrol mendapatkan fokus, yang berarti jika Anda tidak menangkap apa yang dikatakannya (dan ini penting), Anda harus mengkliknya untuk melihat teks placeholder lagi . Saya menambahkan jawaban lain untuk menambahkan placeholder yang hilang hanya setelah pengguna mulai mengetik.
Gabriel Luci
19

Tambahkan kelas ini proyek Anda dan bangun solusi Anda. Klik untuk Toolbox di visual studio Anda akan melihat komponen kotak teks baru bernama PlaceholderTextBox. Hapus kotak teks Anda saat ini pada formulir desain dan ganti dengan PlaceHolderTextBox.

masukkan deskripsi gambar di sini

PlaceHolderTextBox memiliki PlaceHolderText properti. Setel teks yang Anda inginkan dan selamat bersenang-senang :)

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
sumber
11
Ketika beberapa kontrol lain bertindak pada nilai Textproperti (misalnya kotak teks yang digunakan untuk memfilter daftar), placeholder akan digunakan untuk memfilter. Nilai placeholder seharusnya hanya digunakan untuk menampilkan, oleh karena itu bukan ide yang baik untuk mengganti Textproperti sementara.
Roland Illig
1
Solusi rapi, saya suka itu. Saya akan menambahkan usings ini di atas kelas, untuk membuatnya bekerja: using System; using System.Drawing; using System.Windows.Forms;Terima kasih untuk ini!
Eldoïr
18

Ini bukan kode saya, tapi saya sering menggunakannya dan berfungsi dengan sempurna ... XAML ONLY

<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
sumber
1
Bekerja seperti pesona, dan jika Anda menambahkan pemicu ke IsFocused dengan mengganti DataTriggeryang berikut ini MultiDataTrigger, itu berfungsi lebih baik menurut pendapat saya:<MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsFocused, ElementName=Textbox}" Value="false" /><Condition Binding="{Binding Text, ElementName=Textbox}" Value="" /></MultiDataTrigger.Conditions><MultiDataTrigger.Setters> <Setter Property="Visibility" Value="Visible"/></MultiDataTrigger.Setters></MultiDataTrigger>
Akku
9

Properti terlampir pada penyelamatan:

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

        SetPlaceholder(dependencyObject, args.NewValue as string);

        if (!tb.IsFocused)
            ShowPlaceholder(tb);
    }

    private static void OnLostFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        ShowPlaceholder(sender as TextBox);
    }

    private static void OnGotFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        HidePlaceholder(sender as TextBox);
    }

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

    private static void ShowPlaceholder(TextBox textBox)
    {
        if (string.IsNullOrWhiteSpace(textBox.Text))
        {
            textBox.Text = GetPlaceholder(textBox);
        }
    }

    private static void HidePlaceholder(TextBox textBox)
    {
        string placeholderText = GetPlaceholder(textBox);

        if (textBox.Text == placeholderText)
            textBox.Text = string.Empty;
    }
}

Pemakaian:

<TextBox Text="hi" local:TextboxExtensions.Placeholder="Hello there"></TextBox>
Dbl
sumber
Terima kasih telah memberikan solusi yang bagus ini. Namun, dengan menggunakan solusi Anda, menghasilkan a) teks placeholder hitam alih-alih abu-abu terang dan b) tidak menampilkan teks placeholder saat aplikasi dimulai (tetapi setelah fokus dan kemudian menetapkan fokus di tempat lain). Maukah Anda meningkatkan jawaban Anda dalam hal ini?
Yoda
1
@Yoda Jika saya berhasil tidak melupakannya sampai saya tiba di rumah saya akan melihat untuk memperbaikinya, yeah - mengapa tidak
Dbl
1
Tempat penampung kosong hingga pemfokusan / pemfokusan diperbaiki.
Sergey
1
@Yoda Hai, saya tidak keberatan jika dilakukan dengan hati-hati dan tidak merusak apa pun.
Sergey
1
@Yoda, maaf, saya belum pernah bekerja dengan WPF untuk sementara waktu, saya bahkan belum menginstalnya saat ini. Anda bisa menambahkan properti dependensi lain PlaceholderColordengan nama typeof(Brush). Kemudian ubah textBox.Foregroundproperti dalam ShowPlaceholdermetode dan kembalikan kembali ke HidePlaceholdermetode.
Sergey
5

Meskipun menggunakan EM_SETCUEBANNERpesan mungkin paling sederhana, satu hal yang saya tidak suka adalah bahwa teks placeholder menghilang ketika kontrol mendapat fokus. Itu kesal saya ketika saya mengisi formulir. Saya harus mengkliknya untuk mengingat untuk apa bidang ini.

Jadi di sini adalah solusi lain untuk WinForms. Itu overlay Labeldi atas kontrol, yang menghilang hanya ketika pengguna mulai mengetik.

Ini tentu bukan antipeluru. Ini menerima apa pun Control, tetapi saya hanya menguji dengan TextBox. Mungkin perlu modifikasi untuk bekerja dengan beberapa kontrol. Metode mengembalikan Labelkontrol jika Anda perlu mengubahnya sedikit dalam kasus tertentu, tetapi itu mungkin tidak pernah diperlukan.

Gunakan seperti ini:

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

Inilah metodenya:

/// <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
sumber
4

Berdasarkan jawaban ExceptionLimeCat, peningkatan:

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
sumber
3

Anda bisa mendapatkan defaultTemplate , memodifikasinya dengan overlay TextBlock, dan menggunakan Styleuntuk menambahkan pemicu yang menyembunyikan dan menampilkannya di negara bagian yang tepat.

HB
sumber
3

Ini berarti Anda memiliki tombol yang memungkinkan Anda melakukan tindakan, seperti masuk atau sesuatu. Sebelum Anda melakukan tindakan, Anda memeriksa apakah kotak teks diisi. Jika tidak, itu akan menggantikan teks

 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 = "";
     }
 }

Ini agak murahan tetapi memeriksa teks untuk nilai yang Anda berikan itu adalah yang terbaik yang bisa saya lakukan atm, tidak begitu baik di c # untuk mendapatkan solusi yang lebih baik.

VJamie
sumber
2
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
sumber
Tolong jelaskan jawaban Anda alih-alih hanya membuang banyak kode ke jawaban Anda.
Dana Gugatan Monica
1

Saya datang dengan metode yang bekerja untuk saya, tetapi hanya karena saya bersedia menggunakan nama kotak teks sebagai pengganti saya. Lihat di bawah.

public TextBox employee = new TextBox();

private void InitializeHomeComponent()
{
    //
    //employee
    //
    this.employee.Name = "Caller Name";
    this.employee.Text = "Caller Name";
    this.employee.BackColor = System.Drawing.SystemColors.InactiveBorder;
    this.employee.Location = new System.Drawing.Point(5, 160);
    this.employee.Size = new System.Drawing.Size(190, 30);
    this.employee.TabStop = false;
    this.Controls.Add(employee);
    // I loop through all of my textboxes giving them the same function
    foreach (Control C in this.Controls)
    {
        if (C.GetType() == typeof(System.Windows.Forms.TextBox))
        {
            C.GotFocus += g_GotFocus;
            C.LostFocus += g_LostFocus;
        }
     }
 }

    private void g_GotFocus(object sender, EventArgs e)
    {
        var tbox = sender as TextBox;
        tbox.Text = "";
    }

    private void g_LostFocus(object sender, EventArgs e)
    {
        var tbox = sender as TextBox;
        if (tbox.Text == "")
        {
            tbox.Text = tbox.Name;
        }
    }
CBC_NS
sumber
1

Di sini saya datang dengan solusi ini yang terinspirasi oleh @Kalal Karadag.

Saya perhatikan bahwa setiap solusi yang diposting di sini mengandalkan fokus,

Sementara saya ingin placeholder saya menjadi tiruan yang tepat dari placeholder HTML standar di Google Chrome.

Alih-alih menyembunyikan / menunjukkan tempat penampung saat kotak difokuskan,

Saya menyembunyikan / menampilkan placeholder tergantung pada panjang teks dari kotak:

Jika kotak kosong, placeholder ditampilkan, dan jika Anda mengetikkan kotak, placeholder menghilang.

Karena diwarisi dari TextBox standar, Anda dapat menemukannya di Toolbox Anda!

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
sumber
0

Coba kode berikut:

<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
sumber
0

txtUsuario.Attributes.Add ("placeholder", "Texto");

Everton Luke
sumber
0

Anda juga dapat melakukannya saat mouse mengklik, misalkan teks placeholder Anda adalah "User_Name"

 private void textBox1_MouseClick(object sender, MouseEventArgs e)
 {
     if(textBox1.Text == "User_Name")
          textBox1.Text = "";
 }
Adiii
sumber
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
sumber
5
Pertanyaannya sudah terpecahkan, bagaimana menggunakan nilai tambah dari jawaban ini? Tidak ada penjelasan tambahkan semua, coba jelaskan.
Jannik
0

Alih-alih menggunakan properti .Text dari TextBox, saya overlay TextBlock dengan placeholder. Saya tidak dapat menggunakan properti .Text karena ini diikat ke suatu Acara.

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

Hasil: masukkan deskripsi gambar di sini

andy
sumber
0

Anda juga bisa mencoba dengan cara ini ..

panggil fungsinya

TextboxPlaceHolder(this.textBox1, "YourPlaceHolder");

tulis fungsi ini

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
sumber
0

ada solusi yang LEBIH BAIK, tetapi solusi termudah di sini: atur teks kotak teks ke string yang Anda inginkan lalu buat fungsi yang menghapus teks, buat fungsi itu menyala di kotak teks Fokus Masukkan acara

Jared
sumber
0

Saya menulis kontrol kustom yang dapat digunakan kembali, mungkin dapat membantu seseorang yang perlu menerapkan beberapa kotak teks placeholder dalam proyeknya.
di sini adalah kelas kustom dengan contoh implementasi contoh, Anda dapat menguji dengan mudah dengan menempelkan kode ini pada proyek winforms baru menggunakan VS:

namespace reusebleplaceholdertextbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // implementation
            CustomPlaceHolderTextbox myCustomTxt = new CustomPlaceHolderTextbox(
                "Please Write Text Here...", Color.Gray, new Font("ARIAL", 11, FontStyle.Italic)
                , Color.Black, new Font("ARIAL", 11, FontStyle.Regular)
                );

            myCustomTxt.Multiline = true;
            myCustomTxt.Size = new Size(200, 50);
            myCustomTxt.Location = new Point(10, 10);
            this.Controls.Add(myCustomTxt);
        }
    }

    class CustomPlaceHolderTextbox : System.Windows.Forms.TextBox
    {
        public string PlaceholderText { get; private set; }
        public Color PlaceholderForeColor { get; private set; }
        public Font PlaceholderFont { get; private set; }

        public Color TextForeColor { get; private set; }
        public Font TextFont { get; private set; }

        public CustomPlaceHolderTextbox(string placeholdertext, Color placeholderforecolor,
            Font placeholderfont, Color textforecolor, Font textfont)
        {
            this.PlaceholderText = placeholdertext;
            this.PlaceholderFont = placeholderfont;
            this.PlaceholderForeColor = placeholderforecolor;
            this.PlaceholderFont = placeholderfont;
            this.TextForeColor = textforecolor;
            this.TextFont = textfont;
            if (!string.IsNullOrEmpty(this.PlaceholderText))
            {
                SetPlaceHolder(true);
                this.Update();
            }
        }

        private void SetPlaceHolder(bool addEvents)
        {
            if (addEvents)
            {  
                this.LostFocus += txt_lostfocus;
                this.Click += txt_click;
            }

            this.Text = PlaceholderText;
            this.ForeColor = PlaceholderForeColor;
            this.Font = PlaceholderFont;
        }

        private void txt_click(object sender, EventArgs e)
        {
            // IsNotFirstClickOnThis:
            // if there is no other control in the form
            // we will have a problem after the first load
            // because we dont other focusable control to move the focus to
            // and we dont want to remove the place holder
            // only on first time the place holder will be removed by click event
            RemovePlaceHolder();
            this.GotFocus += txt_focus;
            // no need for this event listener now
            this.Click -= txt_click;
        }

        private void RemovePlaceHolder()
        {
            this.Text = "";
            this.ForeColor = TextForeColor;
            this.Font = TextFont;
        }
        private void txt_lostfocus(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.Text))
            {
                // set placeholder again
                SetPlaceHolder(false);
            }
        }

        private void txt_focus(object sender, EventArgs e)
        {
            if (this.Text == PlaceholderText)
            {
                // IsNotFirstClickOnThis:
                // if there is no other control in the form
                // we will have a problem after the first load
                // because we dont other focusable control to move the focus to
                // and we dont want to remove the place holder
                RemovePlaceHolder();
            }
        }
    }
}
Jonathana
sumber
-1

Solusi yang sangat efektif di sini untuk kontrol WindowsForms TextBox. (tidak yakin tentang XAML).

Ini juga akan berfungsi dalam mode Multliline.

Mungkin dapat diperluas untuk kontrol lain, seperti kontrol ComboBox (tidak dicentang)

Anton Norko
sumber
-1

Bekerja seperti pesona.

public class WTextBox : TextBox
{
    private string _placeholder;


    [Category("Appearance")]
    public string Placeholder
    {
        get { return _placeholder; }
        set
        {
            _placeholder = value ?? string.Empty;
            Invalidate();
        }
    }

    public WTextBox()
    {
        _placeholder = string.Empty;
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg != 0xF || Focused || !string.IsNullOrEmpty(Text) || string.IsNullOrWhiteSpace(_placeholder))
        {
            return;
        }

        using (var g = CreateGraphics())
        {
            TextRenderer.DrawText(g, _placeholder, Font, ClientRectangle, SystemColors.GrayText, BackColor, TextFormatFlags.Left);
        }
    }
}
Sergey
sumber
Silakan tambahkan usings yang diperlukan
Akku