Thêm văn bản giữ chỗ vào hộp văn bản


147

Tôi đang tìm cách để thêm văn bản giữ chỗ vào một hộp văn bản như bạn có thể với một hộp văn bản trong html5.

Tức là nếu hộp văn bản không có văn bản, thì nó sẽ thêm văn bản Enter some text here, khi người dùng nhấp vào nó, văn bản giữ chỗ sẽ biến mất và cho phép người dùng nhập văn bản của riêng họ và nếu hộp văn bản mất tiêu điểm và vẫn không có văn bản thì giữ chỗ thêm lại vào hộp văn bản.


4
Không sử dụng thuộc tính Text cho văn bản giữ chỗ. Nó sẽ can thiệp vào sự ràng buộc. Sử dụng AdornerDecorator ( msdn.microsoft.com/en-us/l Library / trộm )
Pavel Voronin


5
Chỉ là một FYI - Watermark aka văn bản gợi ý hay còn gọi là văn bản giữ chỗ hay còn gọi là banner cue . Tất cả các điều khoản có ý định đồng nghĩa.
RBT

Câu trả lời:


91

Sẽ không phải là một cái gì đó như thế này:

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

Đó chỉ là mã giả nhưng khái niệm là có.


Cảm ơn tôi đã mong đợi có một số loại XAML có thể được sử dụng để tạo trình giữ chỗ. Cảm ơn sự giúp đỡ của bạn
Boardy

1
Tôi đã hy vọng tìm ra một giải pháp giữ văn bản giữ chỗ trong hộp văn bản cho đến khi người dùng nhập văn bản. Có vẻ như điều đó sẽ làm việc tốt hơn.
Người dùng DROP TABLE

6
Điều này sẽ hoạt động NHƯNG nếu giá trị hộp văn bản bị ràng buộc với nguồn thì bạn có thể có vấn đề.
Pavel Voronin

1
Đây là giải pháp đơn giản tốt, chỉ có điều là ngay cả sau khi nhập văn bản, nếu người dùng nhấp lại vào hộp văn bản (ví dụ để thêm văn bản hoặc xóa một số ký tự), toàn bộ hộp văn bản sẽ mất giá trị đã nhập
Bibaswann Bandyopadhyay

2
RemoveTextAddTextphương pháp nên public void, thiếu khoảng trống . Và như @BibaswannBandyopadhyay đã nói, RemoveTextphương pháp có thể là thế này:if (myTxtbx.Text == "Enter text here...") {myTxtbx.Text = "";}
KaKa

91

Bạn có thể sử dụng cái này, nó hiệu quả với tôi và là giải pháp cực kỳ đơn giản.

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

Sử dụng:

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

Hay nói, là một tài tài của, qua, qua, qua một tài khác, qua giữ, qua một tài khác


1
Xin chào @MacGile, tôi đã sửa đổi giải pháp tuyệt vời của bạn, bởi vì tôi cần ràng buộc hai chiều giữa thuộc tính văn bản gốc và thuộc tính textSource.Text.
Gábor Plesz

1
@Rob đặt nó trong một từ điển tài nguyên. Window.Resource, v.v.
Brian

6
Đối với các vấn đề trọng tâm, hãy thêm điều này: <ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="FocusManager.FocusedElement" TargetName="textSource" Value="{Binding RelativeSource={RelativeSource Self}}" /> </Trigger> </ControlTemplate.Triggers>
Cihan Yakar

1
Tôi đã xử lý TextWrapping="wrap"cả hai thẻ TextBox trong Kiểu, trong trường hợp bạn muốn thực hiện TextBox nhiều dòng với văn bản Placeholder như tôi đã làm.
jpcguy89 04/11/2015

1
@Sachin Tôi đã sửa tài sản MaxLenght của mình. Vấn đề là một hộp văn bản được thay thế bằng 2 hộp văn bản. Một cho đầu vào và một cho giữ chỗ. Để sửa các thuộc tính bị hỏng, bạn chỉ cần thêm chúng vào hộp văn bản đầu tiên như thế này : <TextBox Text="{Binding Path=Text, RelativeSource=RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="textSource" Background="Transparent" Panel.ZIndex="2" MaxLength="{TemplateBinding MaxLength}" />. Trong trường hợp của bạn, có lẽ bạn cần phải thêmAcceptsReturn="{TemplateBinding AcceptsReturn}"
ColmanJ

47

Thay vì xử lý các sự kiện nhập tiêu điểm và tập trung để đặt và xóa văn bản giữ chỗ, có thể sử dụng chức năng Windows SendMessage để gửi EM_SETCUEBANNERtin nhắn đến hộp văn bản của chúng tôi để thực hiện công việc cho chúng tôi.

Điều này có thể được thực hiện với hai bước dễ dàng. Đầu tiên chúng ta cần trưng ra SendMessagechức năng 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);

Sau đó, chỉ cần gọi phương thức với tay cầm của hộp văn bản của chúng tôi, giá trị của EM_SETCUEBANNER và văn bản chúng tôi muốn đặt.

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

Tham khảo: Đặt văn bản giữ chỗ cho hộp văn bản (văn bản cue)


10
Lưu ý: điều này không hoạt động cho WPF . Xem: stackoverflow.com/questions/5054872/ từ
ArtOfCode

Câu trả lời hay nhất ở đây, nhưng lưu ý Form_Load là quá sớm, tôi đã phải đợi cho đến khi Form_Shown trước khi nó hoạt động.
Jay Cro Afghanistan

Điều duy nhất tôi ghét về điều này là văn bản biến mất ngay khi điều khiển được tập trung, điều đó có nghĩa là nếu bạn không nắm bắt được những gì nó nói (và nó quan trọng), bạn phải bấm vào nó để xem lại văn bản giữ chỗ . Tôi đã thêm một câu trả lời khác để thêm một trình giữ chỗ chỉ biến mất sau khi người dùng bắt đầu nhập.
Gabriel Luci

19

Thêm lớp này dự án của bạn và xây dựng giải pháp của bạn. Nhấp vào Hộp công cụ trên phòng thu trực quan, bạn sẽ thấy một thành phần hộp văn bản mới có tên PlaceholderTextBox. Xóa hộp văn bản hiện tại của bạn trên mẫu chỉ định và thay thế bằng PlaceHolderTextBox.

nhập mô tả hình ảnh ở đây

PlaceHolderTextBox có một thuộc tính PlaceHolderText. Đặt bất kỳ văn bản nào bạn muốn và có một ngày tốt đẹp :)

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
Khi một số điều khiển khác tác động đến giá trị của thuộc Texttính (ví dụ: hộp văn bản được sử dụng để lọc danh sách), trình giữ chỗ sẽ được sử dụng để lọc. Giá trị giữ chỗ chỉ nên được sử dụng để hiển thị, do đó không nên thay thế Texttài sản tạm thời.
Roland Illig

1
Giải pháp gọn gàng, tôi thích nó. Tôi sẽ thêm những cách sử dụng này lên đầu lớp, để làm cho nó hoạt động: using System; using System.Drawing; using System.Windows.Forms;Cảm ơn vì điều này!
Eldoïr

18

Đây không phải là mã của tôi, nhưng tôi sử dụng nó rất nhiều và nó hoạt động hoàn hảo ... CHỈ 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
Hoạt động như một bùa mê và nếu bạn thêm một kích hoạt vào IsF Focused bằng cách thay thế DataTriggerbằng cách sau MultiDataTrigger, nó sẽ hoạt động tốt hơn theo quan điểm khiêm tốn của tôi:<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

Tài sản đính kèm để giải cứu:

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

Sử dụng:

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

Cảm ơn đã cung cấp giải pháp tốt đẹp này. Tuy nhiên, bằng cách sử dụng giải pháp của bạn, kết quả là một) văn bản giữ chỗ màu đen thay vì văn bản màu xám nhạt và b) không hiển thị văn bản giữ chỗ khi bắt đầu ứng dụng (nhưng sau khi lấy nét và sau đó đặt tiêu điểm ở nơi khác). Bạn có muốn cải thiện câu trả lời của bạn về vấn đề này?
Yoda

1
@Yoda Nếu tôi cố gắng không quên nó cho đến khi về nhà tôi sẽ xem xét cải thiện nó, ừ - tại sao không
Dbl

1
Giữ chỗ trống cho đến khi tập trung / không tập trung cố định.
Serge

1
@Yoda Xin chào, tôi không phiền nếu nó được thực hiện cẩn thận và không phá vỡ bất cứ điều gì.
Serge

1
@Yoda, xin lỗi, tôi đã không làm việc với WPF được một thời gian, tôi thậm chí không cài đặt nó vào lúc này. Bạn có thể thêm một tài sản phụ thuộc tên PlaceholderColorvới typeof(Brush). Sau đó thay đổi textBox.Foregroundthuộc tính trong ShowPlaceholderphương thức và khôi phục lại trong HidePlaceholderphương thức.
Serge

5

Mặc dù sử dụng EM_SETCUEBANNERtin nhắn có lẽ là đơn giản nhất, nhưng một điều tôi không thích là văn bản giữ chỗ sẽ biến mất khi điều khiển được lấy nét. Đó là một tiểu thú cưng của tôi khi tôi điền vào mẫu đơn. Tôi phải bấm vào nó để nhớ trường này dùng để làm gì.

Vì vậy, đây là một giải pháp khác cho WinForms. Nó phủ Labellên trên đỉnh của điều khiển, nó chỉ biến mất khi người dùng bắt đầu gõ.

Nó chắc chắn không chống đạn. Nó chấp nhận bất kỳ Control, nhưng tôi chỉ thử nghiệm với a TextBox. Nó có thể cần sửa đổi để làm việc với một số điều khiển. Phương thức trả về Labelđiều khiển trong trường hợp bạn cần sửa đổi nó một chút trong trường hợp cụ thể, nhưng điều đó có thể không bao giờ cần thiết.

Sử dụng nó như thế này:

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

Đây là phương pháp:

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

Dựa trên câu trả lời của ExceptionLimeCat, một cải tiến:

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

Bạn có thể lấy mặc địnhTemplate , sửa đổi nó bằng cách phủ lên một TextBlockvà sử dụng một Styleđể thêm các kích hoạt ẩn và hiển thị nó ở đúng trạng thái.


3

Điều này có nghĩa là bạn có một nút cho phép bạn thực hiện một hành động, chẳng hạn như đăng nhập hoặc một cái gì đó. Trước khi thực hiện hành động, bạn kiểm tra xem hộp văn bản có được điền không. Nếu không, nó sẽ thay thế văn bản

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

Thật là nhảm nhí nhưng kiểm tra văn bản cho giá trị mà bạn đưa ra là điều tốt nhất tôi có thể làm, không phải là tốt ở c # để có được giải pháp tốt hơn.


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

Vui lòng giải thích câu trả lời của bạn thay vì chỉ bỏ một loạt mã vào câu trả lời của bạn.
Vụ kiện của Quỹ Monica

1

Tôi đã đưa ra một phương pháp hiệu quả với tôi, nhưng chỉ vì tôi sẵn sàng sử dụng tên hộp văn bản làm trình giữ chỗ của mình. Xem bên dưới.

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

Ở đây tôi đi kèm với giải pháp này lấy cảm hứng từ @Kemal Karadag.

Tôi nhận thấy rằng mọi giải pháp được đăng ở đây đều dựa vào trọng tâm,

Mặc dù tôi muốn trình giữ chỗ của mình là bản sao chính xác của trình giữ chỗ HTML tiêu chuẩn trong Google Chrome.

Thay vì ẩn / hiển thị trình giữ chỗ khi hộp được tập trung,

Tôi ẩn / hiển thị trình giữ chỗ tùy thuộc vào độ dài văn bản của hộp:

Nếu hộp trống, trình giữ chỗ được hiển thị và nếu bạn nhập vào hộp, trình giữ chỗ sẽ biến mất.

Vì nó được kế thừa từ một TextBox tiêu chuẩn, bạn có thể tìm thấy nó trong Hộp công cụ của mình!

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

Hãy thử đoạn mã sau:

<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

bạn cũng có thể làm điều đó khi nhấp chuột, giả sử văn bản giữ chỗ của bạn là "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
Câu hỏi đã được giải quyết, những gì sử dụng giá trị gia tăng của câu trả lời này? Không có lời giải thích thêm tất cả, hãy cố gắng giải thích nó.
Jannik

0

Thay vì sử dụng thuộc tính .Text của TextBox, tôi đã phủ lớp TextBlock với trình giữ chỗ. Tôi không thể sử dụng thuộc tính .Text vì điều này được liên kết với một Sự kiện.

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

Kết quả: nhập mô tả hình ảnh ở đây


0

Bạn cũng có thể thử theo cách này ..

gọi hàm

TextboxPlaceHolder(this.textBox1, "YourPlaceHolder");

viết hàm này

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

có các giải pháp TỐT HƠN, nhưng giải pháp đơn giản nhất ở đây: đặt văn bản hộp văn bản thành chuỗi mong muốn của bạn sau đó tạo một chức năng xóa văn bản, để chức năng đó kích hoạt sự kiện Focus Enter


0

Tôi đã viết một điều khiển tùy chỉnh có thể sử dụng lại, có thể nó có thể giúp ai đó cần triển khai nhiều hộp văn bản giữ chỗ trong dự án của anh ta.
đây là lớp tùy chỉnh với ví dụ triển khai của một thể hiện, bạn có thể kiểm tra dễ dàng bằng cách dán mã này vào dự án winforms mới bằng cách sử dụng 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();
            }
        }
    }
}

-1

Giải pháp rất hiệu quả ở đây để kiểm soát WindowsForms TextBox. (không chắc chắn về XAML).

Điều này cũng sẽ hoạt động trong chế độ Multliline.

Có lẽ nó có thể được mở rộng cho các điều khiển khác, như điều khiển ComboBox (không được kiểm tra)


-1

Hoạt động như một lá bùa.

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

Vui lòng thêm các ứng dụng cần thiết
Akku
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.