2

Possible Duplicate:
Watermark TextBox in WPF

May i know how to put some default texts in the password box in WPF? I use MSN messenger as an example. When its default, the password field will show the "password" in the Password Box. When i click and type on the password box, the "password" text will disappear and the dots will replace it.

enter image description here

enter image description here

Vadim Ovchinnikov
  • 13,327
  • 5
  • 62
  • 90
Nerdynosaur
  • 1,798
  • 9
  • 32
  • 61
  • http://stackoverflow.com/questions/833943/watermark-textbox-in-wpf – Habib Oct 24 '12 at 06:25
  • Looks like this question is closed but for anyone who lands here, an alternative is a bit hacky but worked for me. Simply make a textbox over the passwordbox with your placeholder text. When the user clicks the textbox is becomes invisible and the password box becomes visible and in focus. – Mwspencer Mar 02 '18 at 17:35

1 Answers1

3

You have to create a custom control to do that.

XAML:

<Window x:Class="WpfTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfTest="clr-namespace:WpfTest" 
    Title="Password Box Sample" Height="300" Width="300"> 
  <Window.Resources> 
    <Style x:Key="{x:Type PasswordBox}" 
        TargetType="{x:Type PasswordBox}"> 
      <Setter Property="WpfTest:PasswordBoxMonitor.IsMonitoring" 
              Value="True"/> 
      <Setter Property="Template"> 
        <Setter.Value> 
          <ControlTemplate TargetType="{x:Type PasswordBox}"> 
            <Border Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    SnapsToDevicePixels="true"> 
              <Grid> 
                <ScrollViewer x:Name="PART_ContentHost" 
                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
                <TextBlock Text="Please enter your password"  
                           Margin="4, 2, 0, 0" 
                           Foreground="Gray"  
                           Visibility="Collapsed" 
                           Name="txtPrompt" /> 
              </Grid> 
            </Border> 
            <ControlTemplate.Triggers> 
              <Trigger Property="IsEnabled" 
                                                                         Value="false"> 
                <Setter TargetName="Bd" 
                                                                                Property="Background" 
                                                                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
                <Setter Property="Foreground" 
                                                                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
              </Trigger> 
              <Trigger Property="WpfTest:PasswordBoxMonitor.PasswordLength" Value="0"> 
                <Setter Property="Visibility" TargetName="txtPrompt" Value="Visible"/> 
              </Trigger> 
            </ControlTemplate.Triggers> 
          </ControlTemplate> 
        </Setter.Value> 
      </Setter> 
    </Style> 
  </Window.Resources> 
  <Grid> 
    <PasswordBox VerticalAlignment="Top"/> 
  </Grid> 
</Window> 

C# code:

using System.Windows; 
using System.Windows.Controls; 

namespace WpfTest 
{ 
    public partial class Window1 : Window 
    { 
        public Window1() 
        { 
                InitializeComponent(); 
        } 

    } 

  public class PasswordBoxMonitor : DependencyObject 
  { 
    public static bool GetIsMonitoring(DependencyObject obj) 
    { 
      return (bool)obj.GetValue(IsMonitoringProperty); 
    } 

    public static void SetIsMonitoring(DependencyObject obj, bool value) 
    { 
      obj.SetValue(IsMonitoringProperty, value); 
    } 

    public static readonly DependencyProperty IsMonitoringProperty = 
        DependencyProperty.RegisterAttached("IsMonitoring", typeof(bool), typeof(PasswordBoxMonitor), new UIPropertyMetadata(false, OnIsMonitoringChanged)); 



    public static int GetPasswordLength(DependencyObject obj) 
    { 
      return (int)obj.GetValue(PasswordLengthProperty); 
    } 

    public static void SetPasswordLength(DependencyObject obj, int value) 
    { 
      obj.SetValue(PasswordLengthProperty, value); 
    } 

    public static readonly DependencyProperty PasswordLengthProperty = 
        DependencyProperty.RegisterAttached("PasswordLength", typeof(int), typeof(PasswordBoxMonitor), new UIPropertyMetadata(0)); 

    private static void OnIsMonitoringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
      var pb = d as PasswordBox; 
      if (pb == null) 
      { 
        return; 
      } 
      if ((bool) e.NewValue) 
      { 
        pb.PasswordChanged += PasswordChanged; 
      } 
      else 
      { 
        pb.PasswordChanged -= PasswordChanged; 
      } 
    } 

    static void PasswordChanged(object sender, RoutedEventArgs e) 
    { 
      var pb = sender as PasswordBox; 
      if (pb == null) 
      { 
        return; 
      } 
      SetPasswordLength(pb, pb.Password.Length); 
    } 
  } 
} 

Reference: WPF Watermark PasswordBox from Watermark TextBox

Community
  • 1
  • 1
Ekk
  • 5,627
  • 19
  • 27