Metin kutusuna yer tutucu metin ekleme


147

Html5 bir metin kutusu gibi bir metin kutusuna yer tutucu metin eklemek için bir yol arıyorum.

Yani metin kutusunun metni yoksa, metni ekler, Enter some text herekullanıcı üzerine tıkladığında yer tutucu metin kaybolur ve kullanıcının kendi metnini girmesine izin verir ve metin odağı kaybederse ve hala metin yoksa yer tutucu metin kutusuna geri eklendi.


4
Yer tutucu metin için Metin özelliğini kullanmayın. Bağlamaya müdahale eder. AdornerDecorator'ı kullanın ( msdn.microsoft.com/en-us/library/… )
Pavel Voronin


5
Sadece bir FYI - Filigran aka ipucu metin aka yer tutucu metin aka işaret afiş . Tüm bu terimler eşanlamlıdır.
RBT

Yanıtlar:


91

Bu sadece böyle bir şey olmaz mı:

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

Bu sadece sözde kod ama konsept var.


Teşekkürler Orada yer tutucu oluşturmak için kullanılabilecek bir çeşit XAML olmasını bekliyordum. Yardımınız için teşekkürler
Boardy

1
Kullanıcı metin girene kadar metin kutusunda yer tutucu metni tutacak bir çözüm bulmayı umuyordum. Bu daha iyi çalışır gibi görünüyor.
DROP TABLE kullanıcıları

6
Eğer metin kutusu değeri kaynağa bağlıysa, bu muhtemelen çalışacaktır, ancak muhtemelen bir sorun var.
Pavel Voronin

1
Bu iyi bir basit çözümdür, tek şey metin girdikten sonra bile, kullanıcı tekrar metin kutusuna tıklarsa (örneğin daha fazla metin eklemek veya bazı karakterleri silmek için) tüm metin
kutusunun

2
RemoveTextve AddTextyöntem public voideksik boşluk olmalıdır . @BibaswannBandyopadhyay'nin dediği gibi, RemoveTextyöntem şu olabilir:if (myTxtbx.Text == "Enter text here...") {myTxtbx.Text = "";}
KaKa

91

Bunu kullanabilirsiniz, benim için çalışıyor ve son derece basit bir çözüm.

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

Kullanımı:

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

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


1
Merhaba @MacGile, ben orijinal metin özelliği ve textSource.Text özelliği arasında iki yönlü bağlama gerektiğinden, büyük çözüm değiştirildi.
Gábor Plesz

1
@ Rob bir kaynak sözlüğüne koydu. Window.Resources, vb.
Brian

6
Odak sorunları için şunu ekleyin: <ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="FocusManager.FocusedElement" TargetName="textSource" Value="{Binding RelativeSource={RelativeSource Self}}" /> </Trigger> </ControlTemplate.Triggers>
Cihan Yakar

1
Yaptığım TextWrapping="wrap"gibi Placeholder metni ile çok satırlı bir TextBox yapmak istemeniz durumunda, Style TextBox etiketlerinin her ikisine de yapardım.
jpcguy89

1
@Sachin MaxLenght mülkümü düzelttim. Sorun, bir metin kutusunun 2 metin kutusuyla değiştirilmesidir. Biri girdi, diğeri yer tutucu için. Düzeltme kırık özelliklerine aynen bu ilk metin eklemek gerekir: <TextBox Text="{Binding Path=Text, RelativeSource=RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="textSource" Background="Transparent" Panel.ZIndex="2" MaxLength="{TemplateBinding MaxLength}" />. Senin durumunda muhtemelen eklemeniz gerekirAcceptsReturn="{TemplateBinding AcceptsReturn}"
ColmanJ

47

Yer tutucu metnini ayarlamak ve kaldırmak için odak giriş ve odak bırakma olaylarını işlemek yerine, göndermek için Windows SendMessage işlevini kullanmak mümkündür. EM_SETCUEBANNER , işi bizim için yapmak üzere metin mesaj .

Bu iki kolay adımda yapılabilir. İlk olarak Windows SendMessageişlevini açığa çıkarmamız gerekiyor .

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

Daha sonra yöntemi metin kutumuzun tutamacı, EM_SETCUEBANNER değeri ve ayarlamak istediğimiz metinle çağırmanız yeterlidir.

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

Referans: Metin kutusu için yer tutucu metni ayarlama (işaret metni)


10
Not: Bu WPF için çalışmaz . Bkz. Stackoverflow.com/questions/5054872/…
ArtOfCode

En iyi cevap burada, ancak Form_Load çok erken, not Form_Shown kadar çalışmasını beklemek zorunda kaldı.
Jay Croghan

Bundan nefret ettiğim tek şey, kontrol odaklanır edilmez metnin kaybolmasıdır, yani söylediklerini yakalayamazsanız (ve önemlidir), yer tutucu metni tekrar görmek için tıklamanız gerekir . Yalnızca kullanıcı yazmaya başladıktan sonra kaybolan bir yer tutucu eklemek için başka bir yanıt ekledim.
Gabriel Luci

19

Bu sınıfı projenize ekleyin ve çözümünüzü oluşturun. Visual Studio'da Toolbox'a tıkladığınızda PlaceholderTextBox adlı yeni bir metin kutusu bileşeni göreceksiniz. Form tasarımındaki geçerli metin kutunuzu silin ve PlaceHolderTextBox ile değiştirin.

resim açıklamasını buraya girin

PlaceHolderTextBox bir PlaceHolderText özelliğine sahiptir. İstediğiniz metni ayarlayın ve iyi günler :)

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

11
Başka bir denetim Textözelliğin değeri üzerinde hareket ettiğinde (örneğin, bir listeyi filtrelemek için kullanılan bir metin kutusu), yer tutucu filtreleme için kullanılır. Yer tutucu değeri yalnızca görüntülemek için kullanılmalıdır, bu nedenle Textözelliği geçici olarak değiştirmek iyi bir fikir değildir .
Roland Illig

1
Düzgün bir çözüm, hoşuma gitti. Çalıştırmak için bu kullanımları sınıfın üstüne eklerdim: Bunun için using System; using System.Drawing; using System.Windows.Forms;teşekkürler!
Eldoïr

18

Bu benim kodum değil, ama çok kullanıyorum ve mükemmel çalışıyor ... SADECE 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>

1
Bir cazibe gibi çalışır DataTriggerve aşağıdakileri değiştirerek IsFocused'a bir tetikleyici eklerseniz MultiDataTrigger, benim düşünceme göre daha da iyi çalışır:<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

Kurtarmaya ekli özellikler:

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

Kullanımı:

<TextBox Text="hi" local:TextboxExtensions.Placeholder="Hello there"></TextBox>

Bu güzel çözümü sağladığınız için teşekkürler. Ancak, çözümünüzü kullanarak a) açık gri yerine siyah yer tutucu metni ve b) uygulama başlangıcında yer tutucu metin göstermez (ancak odaklandıktan sonra odağı başka bir yere ayarladıktan sonra). Bu konuda cevabınızı geliştirmeyi düşünür müsünüz?
Yoda

1
@Yoda eve gelene kadar unutmamayı başarırsam, onu geliştirmeye bakacağım, evet - neden olmasın
Dbl

1
Odaklanana / odaklanana kadar boş yer tutucu düzeltildi.
Sergey

1
@Yoda Merhaba, dikkatlice yapıldıysa ve hiçbir şey kırmazsa umrumda değil.
Sergey

1
@Yoda, üzgünüm, bir süredir WPF ile çalışmıyorum, şu anda yüklü bile değilim. Sen adında başka bağımlılık özelliği ekleyebilir PlaceholderColorile typeof(Brush). Ardından yöntemdeki textBox.Foregroundözelliği değiştirin ve ShowPlaceholderyöntemde geri yükleyin HidePlaceholder.
Sergey

5

Kullanırken EM_SETCUEBANNERİletiyi muhtemelen en basit olsa da, sevmediğim bir şey, kontrol odaklandığında yer tutucu metnin kaybolmasıdır. Bu formları doldururken benim evcil hayvanım. Alanın ne için olduğunu hatırlamak için tıklayın.

İşte WinForms için başka bir çözüm. LabelYalnızca kullanıcı yazmaya başladığında kaybolan, kontrolün üst kısmına bindirilir .

Kesinlikle kurşun geçirmez değil. Herhangi birini kabul eder Control, ama sadece bir ile test ettim TextBox. Bazı kontrollerle çalışmak için modifikasyon gerekebilir. LabelBelirli bir durumda biraz değiştirmeniz gerektiğinde yöntem denetimi döndürür , ancak bu hiçbir zaman gerekli olmayabilir.

Şöyle kullanın:

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

İşte yöntem:

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

4

ExceptionLimeCat'ın cevabına dayanarak, bir gelişme:

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

3

Şunları yapabilirsiniz varsayılan olsunTemplate , bir paylaşımlı, değiştirmek TextBlockve kullanmak Styleolduğunu gizlemek tetikleyiciler eklemek ve doğru eyaletlerde göstermektedir.


3

Bu, oturum açma vb. Gibi bir işlem yapmanıza izin veren bir düğmeye sahip olduğunuz anlamına gelir. Eylemi yapmadan önce metin kutusunun doldurulup doldurulmadığını kontrol edersiniz. Değilse metnin yerini alacaktır

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

Sevimsiz ama metni verdiğiniz değer için kontrol etmek, atm yapabileceğim en iyi şey, daha iyi bir çözüm elde etmek için c # 'da iyi değil.


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

Cevabınıza sadece bir grup kod dökmek yerine cevabınızı açıklayınız.
Monica'nın Davası,

1

Benim için çalışan bir yöntem buldum, ancak yalnızca metin kutusu adını yer tutucum olarak kullanmaya istekli olduğum için. Aşağıya bakınız.

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

1

İşte @Kemal Karadağ'dan esinlenilen bu çözümle geliyorum.

Burada yayınlanan her çözümün odağa dayandığını fark ettim,

Yer tutucumun Google Chrome'daki standart bir HTML yer tutucusunun tam klonu olmasını isterdim.

Kutu odaklandığında yer tutucuyu gizlemek / göstermek yerine,

Kutunun metin uzunluğuna bağlı olarak yer tutucuyu gizler / gösteririm:

Kutu boşsa, yer tutucu gösterilir ve kutuya yazarsanız yer tutucu kaybolur.

Standart bir TextBox'tan devralındığı için, bunu Toolbox'ınızda bulabilirsiniz!

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

0

Aşağıdaki kodu deneyin:

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


0

bunu fare tıkladığında da yer tutucu metninizin "Kullanıcı_Adı" olduğunu varsayalım

 private void textBox1_MouseClick(object sender, MouseEventArgs e)
 {
     if(textBox1.Text == "User_Name")
          textBox1.Text = "";
 }

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

5
Soru zaten çözüldü, bu cevabın katma değeri nedir? Hiçbir açıklama eklemek yok, açıklamaya çalışın.
Jannik

0

Bir TextBox .Text özelliğini kullanmak yerine, bir TextBlock yer tutucu ile yerleşti. Bu bir Event'e bağlandığından .Text özelliğini kullanamadım.

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

Sonuç: resim açıklamasını buraya girin


0

Bu şekilde de deneyebilirsiniz ..

işlevi çağır

TextboxPlaceHolder(this.textBox1, "YourPlaceHolder");

bu işlevi yaz

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

        };
}

0

DAHA İYİ çözümler var, ancak en kolay çözüm burada: metin kutusu metnini istediğiniz dizeye ayarlayın, ardından metni silen bir işlev oluşturun, bu işlevi metin kutusunda etkinleştirin Focus Enter olayı


0

Yeniden kullanılabilir bir özel kontrol yazdım, belki de projesinde birden fazla yer tutucu metin kutusu uygulaması gereken birine yardımcı olabilir.
İşte bir örnek uygulama örneği ile özel sınıf, VS kullanarak bu kodu yeni bir winforms projesine yapıştırarak kolayca test edebilirsiniz:

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

-1

WindowsForms TextBox kontrolü için burada çok etkili bir çözüm . (XAML hakkında emin değilim).

Bu Multililine modunda da çalışacaktır.

Muhtemelen ComboBox kontrolü (işaretlenmemiş) gibi diğer kontroller için genişletilebilir


-1

Tıkır tıkır çalışıyor.

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

Lütfen gerekli kullanımları ekleyin
Akku
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.