C# 如何在密码箱wpf中设置一些默认文本?

C# 如何在密码箱wpf中设置一些默认文本?,c#,wpf,placeholder,C#,Wpf,Placeholder,可能重复: 我可以知道如何在WPF的密码框中输入一些默认文本吗? 我以MSN messenger为例。默认情况下,密码字段将在密码框中显示“密码”。当我点击并键入密码框时,“密码”文本将消失,圆点将取代它 必须创建自定义控件才能执行此操作 XAML: <Window x:Class="WpfTest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="

可能重复:

我可以知道如何在WPF的密码框中输入一些默认文本吗? 我以MSN messenger为例。默认情况下,密码字段将在密码框中显示“密码”。当我点击并键入密码框时,“密码”文本将消失,圆点将取代它


必须创建自定义控件才能执行此操作

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

参考资料:

看起来这个问题已经结束了,但对于任何登陆这里的人来说,另一个选择有点老套,但对我来说是可行的。只需使用占位符文本在密码框上创建一个文本框。当用户单击时,文本框变为不可见,密码框变为可见并处于焦点。