Platzhaltertext zum Textfeld hinzufügen


147

Ich suche nach einer Möglichkeit, einem Textfeld Platzhaltertext hinzuzufügen, wie Sie es mit einem Textfeld in HTML5 können.

Wenn das Textfeld keinen Text enthält, wird der Text hinzugefügt. Enter some text hereWenn der Benutzer darauf klickt, verschwindet der Platzhaltertext und der Benutzer kann seinen eigenen Text eingeben. Wenn das Textfeld den Fokus verliert und noch kein Text vorhanden ist, ist der Platzhalter vorhanden wieder zum Textfeld hinzugefügt.


4
Verwenden Sie die Text-Eigenschaft nicht für Platzhaltertext. Es wird die Bindung stören. Verwenden Sie AdornerDecorator ( msdn.microsoft.com/en-us/library/… )
Pavel Voronin


5
Nur ein FYI - Wasserzeichen alias Hinweistext alias Platzhaltertext alias Stichwortbanner . Alle diese Begriffe haben auch Absicht.
RBT

Antworten:


91

Wäre das nicht einfach so?

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

Das ist nur Pseudocode, aber das Konzept ist da.


Vielen Dank, ich hatte erwartet, dass es eine Art XAML gibt, mit der der Platzhalter erstellt werden kann. Vielen Dank für Ihre Hilfe
Boardy

1
Ich hatte gehofft, eine Lösung zu finden, die den Platzhaltertext im Textfeld behält, bis der Benutzer Text eingibt. Scheint so, als würde das besser funktionieren.
DROP TABLE Benutzer

6
Dies funktioniert ABER wenn der Textfeldwert an die Quelle gebunden ist, haben Sie wahrscheinlich ein Problem.
Pavel Voronin

1
Das ist gut , einfache Lösung, ist nur noch , dass auch nach der Texteingabe, wenn wieder Benutzer auf das Textfeld klickt (zB mehr Text angefügt werden oder einige Zeichen löschen) das ganze Feld wird der eingegebene Wert verlieren
Bibaswann Bandyopadhyay

2
RemoveTextund AddTextMethode sollte sein public void, fehlende Leere . Und wie @BibaswannBandyopadhyay gesagt hat, könnte die RemoveTextMethode folgende sein:if (myTxtbx.Text == "Enter text here...") {myTxtbx.Text = "";}
KaKa

91

Sie können dies verwenden, es funktioniert für mich und ist eine extrem einfache Lösung.

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

Verwendung:

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

.


1
Hallo @MacGile, ich habe Ihre großartige Lösung geändert, da ich die bidirektionale Bindung zwischen der ursprünglichen Texteigenschaft und der textSource.Text-Eigenschaft benötige.
Gábor Plesz

1
@Rob legte es in ein Ressourcenwörterbuch. Window.Resources, etc.
Brian

6
Für Fokusprobleme fügen Sie Folgendes hinzu: <ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="FocusManager.FocusedElement" TargetName="textSource" Value="{Binding RelativeSource={RelativeSource Self}}" /> </Trigger> </ControlTemplate.Triggers>
Cihan Yakar

1
Ich würde TextWrapping="wrap"beide TextBox-Tags im Stil anheften, falls Sie wie ich eine mehrzeilige TextBox mit Platzhaltertext erstellen möchten.
jpcguy89

1
@Sachin Ich habe meine MaxLenght-Eigenschaft behoben. Das Problem ist, dass ein Textfeld durch zwei Textfelder ersetzt wird. Eine für die Eingabe und eine für den Platzhalter. Um fehlerhafte Eigenschaften zu beheben, müssen Sie sie nur wie folgt zum ersten Textfeld hinzufügen : <TextBox Text="{Binding Path=Text, RelativeSource=RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="textSource" Background="Transparent" Panel.ZIndex="2" MaxLength="{TemplateBinding MaxLength}" />. In Ihrem Fall müssen Sie wahrscheinlich hinzufügenAcceptsReturn="{TemplateBinding AcceptsReturn}"
ColmanJ

47

Anstatt die Ereignisse zum Eingeben und Verlassen des Fokus zu behandeln, um den Platzhaltertext festzulegen und zu entfernen, können Sie mit der Windows-Funktion SendMessage eine EM_SETCUEBANNERNachricht an unser Textfeld senden , um die Arbeit für uns zu erledigen.

Dies kann in zwei einfachen Schritten erfolgen. Zuerst müssen wir die Windows- SendMessageFunktion verfügbar machen .

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

Rufen Sie dann einfach die Methode mit dem Handle unseres Textfelds, dem Wert von EM_SETCUEBANNER und dem Text auf, den Sie festlegen möchten.

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

Referenz: Platzhaltertext für Textfeld festlegen (Cue-Text)


10
Hinweis: Dies funktioniert nicht für WPF . Siehe: stackoverflow.com/questions/5054872/…
ArtOfCode

Beste Antwort hier, aber beachten Sie, dass Form_Load zu früh ist. Ich musste bis Form_Shown warten, bevor es funktionierte.
Jay Croghan

Das einzige, was ich daran hasse, ist, dass der Text verschwindet, sobald das Steuerelement den Fokus erhält. Wenn Sie also nicht verstanden haben, was es gesagt hat (und es ist wichtig), müssen Sie darauf klicken, um den Platzhaltertext wieder zu sehen . Ich habe eine weitere Antwort hinzugefügt, um einen Platzhalter hinzuzufügen, der erst verschwindet, nachdem der Benutzer mit der Eingabe begonnen hat.
Gabriel Luci

19

Fügen Sie dieser Klasse Ihr Projekt hinzu und erstellen Sie Ihre Lösung. Klicken Sie in Visual Studio auf Toolbox. Daraufhin wird eine neue Textboxkomponente mit dem Namen PlaceholderTextBox angezeigt. Löschen Sie Ihr aktuelles Textfeld im Formularentwurf und ersetzen Sie es durch PlaceHolderTextBox.

Geben Sie hier die Bildbeschreibung ein

PlaceHolderTextBox hat eine Eigenschaft PlaceHolderText. Setze einen beliebigen Text und wünsche dir einen schönen Tag :)

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
Wenn ein anderes Steuerelement auf den Wert der TextEigenschaft einwirkt (z. B. ein Textfeld zum Filtern einer Liste), wird der Platzhalter zum Filtern verwendet. Der Platzhalterwert sollte nur zur Anzeige verwendet werden. Daher ist es nicht ratsam, die TextEigenschaft vorübergehend zu ersetzen .
Roland Illig

1
Ordentliche Lösung, ich mag es. Ich würde diese Verwendungen zusätzlich zur Klasse hinzufügen, damit es funktioniert: using System; using System.Drawing; using System.Windows.Forms;Danke dafür!
Eldoïr

18

Dies ist nicht mein Code, aber ich benutze ihn oft und er funktioniert perfekt ... NUR 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
Funktioniert wie ein Zauber, und wenn Sie IsFocused einen Auslöser hinzufügen, DataTriggerindem Sie den folgenden ersetzen MultiDataTrigger, funktioniert es meiner bescheidenen Meinung nach noch besser:<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

Angehängte Eigenschaften zur Rettung:

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

Verwendung:

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

Vielen Dank für die Bereitstellung dieser schönen Lösung. Wenn Sie Ihre Lösung verwenden, erhalten Sie jedoch a) schwarzen Platzhaltertext anstelle eines hellgrauen und b) beim Start der Anwendung keinen Platzhaltertext (aber nachdem Sie fokussiert und dann den Fokus an einer anderen Stelle gesetzt haben). Würde es Ihnen etwas ausmachen, Ihre Antwort in dieser Hinsicht zu verbessern?
Yoda

1
@ Yoda Wenn ich es schaffe, es nicht zu vergessen, bis ich nach Hause komme, werde ich versuchen, es zu verbessern, ja - warum nicht
Dbl

1
Leerer Platzhalter, bis das Fokussieren / Deaktivieren behoben ist.
Sergey

1
@ Yoda Hallo, es macht mir nichts aus, wenn es sorgfältig gemacht wird und nichts kaputt macht.
Sergey

1
@Yoda, sorry, ich habe eine Weile nicht mehr mit WPF gearbeitet, ich habe es im Moment noch nicht einmal installiert. Sie können eine weitere Abhängigkeitseigenschaft PlaceholderColormit dem Namen hinzufügen typeof(Brush). Ändern Sie dann die textBox.ForegroundEigenschaft in der ShowPlaceholderMethode und stellen Sie sie in der HidePlaceholderMethode wieder her.
Sergey

5

Während die Verwendung der EM_SETCUEBANNERNachricht wahrscheinlich am einfachsten ist, gefällt mir nicht, dass der Platzhaltertext verschwindet, wenn das Steuerelement den Fokus erhält. Das ist ein kleiner Ärger von mir, wenn ich Formulare ausfülle. Ich muss darauf klicken, um mich daran zu erinnern, wofür das Feld ist.

Hier ist eine weitere Lösung für WinForms. Es überlagert ein LabelSteuerelement, das erst verschwindet, wenn der Benutzer mit der Eingabe beginnt.

Es ist sicherlich nicht kugelsicher. Es akzeptiert keine Control, aber ich habe nur mit einem getestet TextBox. Möglicherweise müssen Änderungen vorgenommen werden, um mit einigen Steuerelementen zu arbeiten. Die Methode gibt das LabelSteuerelement zurück, falls Sie es in einem bestimmten Fall ein wenig ändern müssen, dies wird jedoch möglicherweise nie benötigt.

Verwenden Sie es so:

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

Hier ist die Methode:

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

Basierend auf der Antwort von ExceptionLimeCat eine Verbesserung:

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

Sie können die StandardeinstellungTemplate abrufen, durch Überlagern von a ändern TextBlockund mit a StyleTrigger hinzufügen, die sie in den richtigen Zuständen ausblenden und anzeigen.


3

Dies würde bedeuten, dass Sie eine Schaltfläche haben, mit der Sie eine Aktion ausführen können, z. B. Anmelden oder ähnliches. Bevor Sie die Aktion ausführen, überprüfen Sie, ob das Textfeld ausgefüllt ist. Wenn nicht, wird der Text ersetzt

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

Es ist ein bisschen kitschig, aber den Text auf den Wert zu überprüfen, den Sie ihm geben, ist das Beste, was ich tun kann, atm, nicht so gut in c #, um eine bessere Lösung zu finden.


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

Bitte erläutern Sie Ihre Antwort, anstatt nur eine Menge Code in Ihre Antwort zu schreiben.
Fund Monica Klage

1

Ich habe eine Methode entwickelt, die für mich funktioniert, aber nur, weil ich bereit war, den Textfeldnamen als Platzhalter zu verwenden. Siehe unten.

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

Hier komme ich mit dieser Lösung, die von @Kemal Karadag inspiriert wurde.

Mir ist aufgefallen, dass jede hier veröffentlichte Lösung auf dem Fokus beruht.

Ich wollte, dass mein Platzhalter der exakte Klon eines Standard-HTML-Platzhalters in Google Chrome ist.

Anstatt den Platzhalter auszublenden / anzuzeigen, wenn das Feld fokussiert ist,

Ich verstecke / zeige den Platzhalter abhängig von der Textlänge des Feldes:

Wenn das Feld leer ist, wird der Platzhalter angezeigt, und wenn Sie das Feld eingeben, verschwindet der Platzhalter.

Da es von einer Standard-TextBox geerbt wurde, finden Sie es in Ihrer Toolbox!

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

Versuchen Sie den folgenden Code:

<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

Sie können dies auch tun, wenn die Maus klickt. Nehmen wir an, Ihr Platzhaltertext lautet "User_Name".

 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
Die Frage ist bereits gelöst, was nutzt den Mehrwert dieser Antwort? Es gibt keine Erklärung, alle hinzufügen, versuchen Sie es zu erklären.
Jannik

0

Anstatt die .Text-Eigenschaft einer TextBox zu verwenden, habe ich einen TextBlock mit dem Platzhalter überlagert. Ich konnte die .Text-Eigenschaft nicht verwenden, da diese an ein Ereignis gebunden war.

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

Ergebnis: Geben Sie hier die Bildbeschreibung ein


0

Sie können es auch auf diese Weise versuchen ..

Rufen Sie die Funktion auf

TextboxPlaceHolder(this.textBox1, "YourPlaceHolder");

schreibe diese Funktion

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

Es gibt BESSERE Lösungen, aber die einfachste Lösung ist hier: Setzen Sie den Textfeldtext auf die gewünschte Zeichenfolge und erstellen Sie eine Funktion, die den Text löscht. Lassen Sie diese Funktion im Textfeld aktivieren. Fokus Eingabe-Ereignis


0

Ich habe ein wiederverwendbares benutzerdefiniertes Steuerelement geschrieben. Vielleicht kann es jemandem helfen, der mehrere Platzhalter-Textfelder in seinem Projekt implementieren muss.
Hier ist die benutzerdefinierte Klasse mit dem Implementierungsbeispiel einer Instanz. Sie können sie einfach testen, indem Sie diesen Code mit VS in ein neues Winforms-Projekt einfügen:

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

Sehr effektive Lösung hier für Windows Boxsteuerelement Text. (nicht sicher über XAML).

Dies funktioniert auch im Multililine-Modus.

Möglicherweise kann es für andere Steuerelemente wie das ComboBox-Steuerelement erweitert werden (nicht aktiviert).


-1

Klappt wunderbar.

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

Bitte fügen Sie die erforderlichen Verwendungen hinzu
Akku
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.