2

重複の可能性:
WPF の透かし TextBox

WPF のパスワード ボックスに既定のテキストを入力する方法を教えてください。例として MSN メッセンジャーを使用します。デフォルトの場合、パスワード フィールドには、パスワード ボックスの「パスワード」が表示されます。パスワードボックスをクリックして入力すると、「パスワード」テキストが消え、ドットが置き換えられます。

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

2

これを行うには、カスタムコントロールを作成する必要があります。

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#コード:

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

参照:Wa​​termarkTextBoxのWPFWatermark PasswordBox

于 2012-10-24T07:49:16.833 に答える