Watermark / hint text / placeholder TextBox

后端 未结 30 2549
遇见更好的自我
遇见更好的自我 2020-11-22 02:20

How can I put some text into a TextBox which is removed automatically when user types something in it?

30条回答
  •  情话喂你
    2020-11-22 02:33

    You can keep a seperate value for the entered text and you can set it along with the "Text" field of the text box in the "GotFocus" and "LostFocus" events. When you get the focus, you'll want to clear the text box if there is no value. And when you loss the focus, you'll want to set the get the "Text" value from the text box and then reset the "Text" value of the text box to the place holder if it is empty.

    private String username = "";
    
    private void usernameTextBox_GotFocus(object sender, RoutedEventArgs e) {
      if (String.IsNullOrEmpty(username)) {
        usernameTextBox.Text = "";
      }
    }
    
    private void usernameTextBox_LostFocus(object sender, RoutedEventArgs e) {
      username = usernameTextBox.Text;
      if (String.IsNullOrEmpty(usernameTextBox.Text)) {
        usernameTextBox.Text = "Username";
      }
    }
    

    Then you just have to make sure that the "Text" value of the text box is initialized to the place holder text.

    
    

    You can further extract this into a class that extends the "TextBox" class and then reuse it through out your project.

    namespace UI {
      public class PlaceholderTextBox : TextBox {
        public String Value { get; set; }
        public String PlaceholderText { get; set; }
        public Brush PlaceholderBrush { get; set; }
        private Brush ValuedBrush { get; set; }
    
        public PlaceholderTextBox() : base() {}
    
        protected override void OnInitialized(EventArgs e) {
          base.OnInitialized(e);
    
          ValuedBrush = this.Foreground;
    
          if (String.IsNullOrEmpty(this.Text)) {
            this.Text = PlaceholderText;
            this.Foreground = PlaceholderBrush;
          }
        }
    
        protected override void OnGotFocus(System.Windows.RoutedEventArgs e) {
          this.Foreground = ValuedBrush;
          if (String.IsNullOrEmpty(Value)) {
            this.Text = "";
          }
    
          base.OnGotFocus(e);
        }
    
        protected override void OnLostFocus(System.Windows.RoutedEventArgs e) {
          Value = this.Text;
          if (String.IsNullOrEmpty(this.Text)) {
            this.Text = PlaceholderText;
            this.Foreground = PlaceholderBrush;
          }
    
          base.OnLostFocus(e);
        }
      }
    }
    

    And then this can be added in the directly in the xaml.

    
        
            
        
    
    

提交回复
热议问题