Watermark / hint text / placeholder TextBox

后端 未结 30 2524
遇见更好的自我
遇见更好的自我 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:36

    I ran into a bit of difficulty when using @john-myczek's code with a bound TextBox. As the TextBox doesn't raise a focus event when it's updated, the watermark would remain visible underneath the new text. To fix this, I simply added another event handler:

    if (d is ComboBox || d is TextBox)
    {
        control.GotKeyboardFocus += Control_GotKeyboardFocus;
        control.LostKeyboardFocus += Control_Loaded;
    
        if (d is TextBox)
            (d as TextBox).TextChanged += Control_TextChanged;
    }
    
    
    private static void Control_TextChanged(object sender, RoutedEventArgs e)
    {
        var tb = (TextBox)sender;
        if (ShouldShowWatermark(tb))
        {
            ShowWatermark(tb);
        }
        else
        {
            RemoveWatermark(tb);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 02:37

    you can use GetFocus() and LostFocus() events to do this

    here is the example:

        private void txtData1_GetFocus(object sender, RoutedEventArgs e)
        {
            if (txtData1.Text == "TextBox1abc")
            {
                txtData1.Text = string.Empty;
            }
        }
    
        private void txtData1_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtData1.Text == string.Empty)
            {
                txtData1.Text = "TextBox1abc";
            }
        }
    
    0 讨论(0)
  • 2020-11-22 02:39

    I found this way to do it in a very fast and easy way

    <ComboBox x:Name="comboBox1" SelectedIndex="0" HorizontalAlignment="Left" Margin="202,43,0,0" VerticalAlignment="Top" Width="149">
      <ComboBoxItem Visibility="Collapsed">
        <TextBlock Foreground="Gray" FontStyle="Italic">Please select ...</TextBlock>
      </ComboBoxItem>
      <ComboBoxItem Name="cbiFirst1">First Item</ComboBoxItem>
      <ComboBoxItem Name="cbiSecond1">Second Item</ComboBoxItem>
      <ComboBoxItem Name="cbiThird1">third Item</ComboBoxItem>
    </ComboBox>
    

    Maybe it can help to anyone trying to do this

    Source: http://www.admindiaries.com/displaying-a-please-select-watermark-type-text-in-a-wpf-combobox/

    0 讨论(0)
  • 2020-11-22 02:40
    <TextBox x:Name="OrderTxt" HorizontalAlignment="Left" VerticalAlignment="Top" VerticalContentAlignment="Center" Margin="10,10,0,0" Width="188" Height="32"/>
    
    <Label IsHitTestVisible="False" Content="Order number" DataContext="{Binding ElementName=OrderTxt}" Foreground="DarkGray">
        <Label.Style>
            <Style TargetType="{x:Type Label}">
                <Setter Property="Visibility" Value="Collapsed"/>
                <Setter Property="Width" Value="{Binding Width}"/>
                <Setter Property="Height" Value="{Binding Height}"/>
                <Setter Property="Margin" Value="{Binding Margin}"/>
                <Setter Property="VerticalAlignment" Value="{Binding VerticalAlignment}"/>
                <Setter Property="HorizontalAlignment" Value="{Binding HorizontalAlignment}"/>
                <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Text}" Value="">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Label.Style>
    </Label>
    
    0 讨论(0)
  • 2020-11-22 02:41

    I have created siple code-only implementation which works fine for WPF and Silverlight as well:

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Media;
    
    public class TextBoxWatermarked : TextBox
    {
        #region [ Dependency Properties ]
    
        public static DependencyProperty WatermarkProperty = DependencyProperty.Register("Watermark",
                                                                                 typeof(string),
                                                                                 typeof(TextBoxWatermarked),
                                                                                 new PropertyMetadata(new PropertyChangedCallback(OnWatermarkChanged)));
    
    
        #endregion
    
    
        #region [ Fields ]
    
        private bool _isWatermarked;
        private Binding _textBinding;
    
        #endregion
    
    
        #region [ Properties ]
    
        protected new Brush Foreground
        {
            get { return base.Foreground; }
            set { base.Foreground = value; }
        }
    
        public string Watermark
        {
            get { return (string)GetValue(WatermarkProperty); }
            set { SetValue(WatermarkProperty, value); }
        }
    
        #endregion
    
    
        #region [ .ctor ]
    
        public TextBoxWatermarked()
        {
            Loaded += (s, ea) => ShowWatermark();
        }
    
        #endregion
    
    
        #region [ Event Handlers ]
    
        protected override void OnGotFocus(RoutedEventArgs e)
        {
            base.OnGotFocus(e);
            HideWatermark();
        }
    
        protected override void OnLostFocus(RoutedEventArgs e)
        {
            base.OnLostFocus(e);
            ShowWatermark();
        }
    
        private static void OnWatermarkChanged(DependencyObject sender, DependencyPropertyChangedEventArgs ea)
        {
            var tbw = sender as TextBoxWatermarked;
            if (tbw == null) return;
            tbw.ShowWatermark();
        }
    
        #endregion
    
    
        #region [ Methods ]
    
        private void ShowWatermark()
        {
            if (string.IsNullOrEmpty(base.Text))
            {
                _isWatermarked = true;
                base.Foreground = new SolidColorBrush(Colors.Gray);
                var bindingExpression = GetBindingExpression(TextProperty);
                _textBinding = bindingExpression == null ? null : bindingExpression.ParentBinding;
                if (bindingExpression != null)
                    bindingExpression.UpdateSource();
                SetBinding(TextProperty, new Binding());
                base.Text = Watermark;
            }
        }
    
        private void HideWatermark()
        {
            if (_isWatermarked)
            {
                _isWatermarked = false;
                ClearValue(ForegroundProperty);
                base.Text = "";
                SetBinding(TextProperty, _textBinding ?? new Binding());
            }
        }
    
        #endregion
    }
    

    Usage:

    <TextBoxWatermarked Watermark="Some text" />
    
    0 讨论(0)
  • 2020-11-22 02:41

    simplest Way to WaterMark Of TextBox

     <Window.Resources>
        <Style x:Key="MyWaterMarkStyle" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Border Background="White" BorderBrush="#FF7D8683" BorderThickness="1"/>
                            <ScrollViewer x:Name="PART_ContentHost" Margin="5,0,0,0" VerticalAlignment="Center" />
                            <Label Margin="5,0,0,0" x:Name="WaterMarkLabel" Content="{TemplateBinding Tag}" VerticalAlignment="Center"
                               Visibility="Collapsed" Foreground="Gray" FontFamily="Arial"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Text" Value=""/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Visibility" TargetName="WaterMarkLabel" Value="Visible"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Foreground" Value="DimGray"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    

    and add textbox StaticResource style

      <TextBox
                    Style="{StaticResource MyWaterMarkStyle}"
                    Tag="Search Category"
                    Grid.Row="0"
                    Text="{Binding CategorySearch,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                    TextSearch.Text="Search Category"
                    >
    
    0 讨论(0)
提交回复
热议问题