PasswordBox
表示用于输入和处理密码的控件。
PasswordBox具有对冒泡的MouseUp和MouseDown事件的内置处理。因此,永远不会调用侦听来自PasswordBox的MouseUp或MouseDown事件的自定义事件处理程序。
如果您需要响应这些事件,请改为监听隧道的PreviewMouseUp和PreviewMouseDown事件,或向HandledEventsToo参数注册处理程序(后一种选项仅可通过代码使用)。
除非您有意要禁用对这些事件的PasswordBox本机处理,否则不要将事件标记为已处理,并且要注意,这会对控件的UI产生显着影响。
Password不支持绑定,若要绑定,需要创建附加属性。这里不做介绍。
字段
名称 | 备注 | 权限 |
---|---|---|
CaretBrushProperty | 标识 CaretBrush 依赖项属性 | public |
IsInactiveSelectionHighlightEnabledProperty | 标识 IsInactiveSelectionHighlightEnabled 依赖项属性 | public |
IsSelectionActiveProperty | 标识 IsSelectionActive 依赖项属性 | public |
MaxLengthProperty | 标识 MaxLength 依赖项属性 | public |
PasswordChangedEvent | 标识 PasswordChanged 路由事件 | public |
PasswordCharProperty | 标识 PasswordChar 依赖项属性 | public |
SelectionBrushProperty | 标识 SelectionBrush 依赖项属性 | public |
SelectionOpacityProperty | 标识 SelectionOpacityProperty 依赖项属性 | public |
SelectionTextBrushProperty | 标识 SelectionTextBrush 依赖项属性 | public |
属性
名称 | 备注 | 权限 |
---|---|---|
CaretBrush | 获取或设置用于指定密码框插入符号颜色的画笔 | get; set; |
IsInactiveSelectionHighlightEnabled | 获取或设置指示当 PasswordBox 没有焦点时,PasswordBox 是否显示所选文本的值 | get; set; |
IsSelectionActive | 获取指示 PasswordBox 是否具有焦点和选择文本的值 | get; |
MaxLength | 获取或设置要由此 PasswordBox 处理的密码的最大长度 | get; set; |
Password | 获取或设置 PasswordBox 当前保留的密码 | get; set; |
PasswordChar | 获取或设置 PasswordBox 的掩码字符 | get; set; |
SecurePassword | 获取当前由 PasswordBox 作为 SecureString 保留的密码 | get; |
SelectionBrush | 获取或设置会突出显示选定文本的画笔 | get; set; |
SelectionOpacity | 获取或设置 SelectionBrush 的不透明度 | get; set; |
SelectionTextBrush | 获取或设置一个值,该值定义了在 PasswordBox 控件中用于所选文本的画笔 | get; set; |
方法
名称 | 备注 | 权限 |
---|---|---|
Clear | 清除 Password 属性的值 | public |
OnApplyTemplate | 在内部进程或应用程序调用用于构建当前模板的可视化树的 ApplyTemplate() 时调用 | public |
Paste | 用剪贴板中的内容替换 PasswordBox 中的当前选定内容 | public |
SelectAll | 选择 PasswordBox 中的全部内容 | public |
事件
名称 | 备注 | 权限 |
---|---|---|
PasswordChanged | 当 Password 属性的值更改时发生 | public |
XAML代码
<Window
x:Class="PasswordBoxDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:PasswordBoxDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="350"
Height="200"
mc:Ignorable="d">
<Grid>
<StackPanel>
<PasswordBox
Height="40"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
FontSize="18"
CaretBrush="Red"
IsInactiveSelectionHighlightEnabled="True"
SelectionBrush="Blue"
SelectionOpacity="0.7"
MaxLength="8"
PasswordChar="×"
PasswordChanged="PasswordBox_PasswordChanged"/>
<Button x:Name="Btn1" Content="清除" Click="Btn1_Click"/>
<Button x:Name="Btn2" Content="全选" Click="Btn2_Click"/>
<PasswordBox/>
</StackPanel>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace PasswordBoxDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
MessageBox.Show(UnSecure((sender as PasswordBox).SecurePassword).ToString());
}
//安全字符串解密为普通字符串
public static string UnSecure(System.Security.SecureString secureString)
{
//Make sure we have a secure string
if (secureString == null)
{
return string.Empty;
}
//Get a pointer for an unsecure string in memory
var unmanagedString = IntPtr.Zero;
try
{
//Unsecures the password
unmanagedString = System.Runtime.InteropServices.Marshal.SecureStringToGlobalAllocUnicode(secureString);
return System.Runtime.InteropServices.Marshal.PtrToStringUni(unmanagedString);
}
finally
{
//Clean up any memory allocation
System.Runtime.InteropServices.Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
private void Btn1_Click(object sender, RoutedEventArgs e)
{
foreach (var item in (((sender as FrameworkElement).Parent) as StackPanel).Children)
{
if (item is PasswordBox) (item as PasswordBox).Clear();
}
}
private void Btn2_Click(object sender, RoutedEventArgs e)
{
foreach (var item in (((sender as FrameworkElement).Parent) as StackPanel).Children)
{
if (item is PasswordBox)
{
(item as PasswordBox).Focus();
(item as PasswordBox).SelectAll();
}
}
}
//下面的方法有助于将字符串转换为安全字符串
//private SecureString ConvertToSecureString(string password)
//{
// if (password == null)
// throw new ArgumentNullException("password");
// var securePassword = new SecureString();
// foreach (char c in password)
// securePassword.AppendChar(c);
// securePassword.MakeReadOnly();
// return securePassword;
//}
}
}
运行效果
字符改变的时候引发PasswordChanged事件,这里通过解密SecurePassword显示(MessageBox.Show)。
单击全选,内部调用SelectAll方法(若要全选,必须先使得PasswordBox获取焦点,否则全选失败)
单击清除,内部调用Clear方法
关于属性,其余都很好理解,除了IsInactiveSelectionHighlightEnabled
比方此实例有2个PasswordBox,第一个PasswordBox有4个字符,此时单击全选。
若IsInactiveSelectionHighlightEnabled=True,此时我们单击第2个PasswordBox(第1个PasswordBox失去焦点),发现选中的字符串部分还显示
若IsInactiveSelectionHighlightEnabled=False,此时我们单击第2个PasswordBox(第1个PasswordBox失去焦点),发现选中的字符串部分不显示
C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace PasswordBoxDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Grid grid = (this as Window).Content as Grid;
//ColumnDefinition column1 = new ColumnDefinition();
//ColumnDefinition column2 = new ColumnDefinition();
//grid.ColumnDefinitions.Add(column1);
//grid.ColumnDefinitions.Add(column2);
//RowDefinition row1 = new RowDefinition();
//RowDefinition row2 = new RowDefinition();
//grid.RowDefinitions.Add(row1);
//grid.RowDefinitions.Add(row2);
StackPanel stackPanel = new StackPanel();
PasswordBox passwordBox1 = new PasswordBox();
PasswordBox passwordBox2 = new PasswordBox();
Button btn1 = new Button();
Button btn2 = new Button();
passwordBox1.Height = 40;
passwordBox1.HorizontalContentAlignment = HorizontalAlignment.Center;
passwordBox1.VerticalContentAlignment = VerticalAlignment.Center;
passwordBox1.FontSize = 18;
passwordBox1.CaretBrush = Brushes.Red;
passwordBox1.IsInactiveSelectionHighlightEnabled = true;
passwordBox1.SelectionBrush = Brushes.Blue;
passwordBox1.SelectionOpacity = 0.7;
passwordBox1.MaxLength = 8;
passwordBox1.PasswordChar = '×';
passwordBox1.PasswordChanged += PasswordBox_PasswordChanged;
btn1.Content = "清除";
btn1.Click += Btn1_Click;
btn2.Content = "全选";
btn2.Click += Btn2_Click;
stackPanel.Children.Add(passwordBox1);
stackPanel.Children.Add(btn1);
stackPanel.Children.Add(btn2);
stackPanel.Children.Add(passwordBox2);
grid.Children.Add(stackPanel);
}
private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
MessageBox.Show(UnSecure((sender as PasswordBox).SecurePassword).ToString());
}
//安全字符串解密为普通字符串
public static string UnSecure(System.Security.SecureString secureString)
{
//Make sure we have a secure string
if (secureString == null)
{
return string.Empty;
}
//Get a pointer for an unsecure string in memory
var unmanagedString = IntPtr.Zero;
try
{
//Unsecures the password
unmanagedString = System.Runtime.InteropServices.Marshal.SecureStringToGlobalAllocUnicode(secureString);
return System.Runtime.InteropServices.Marshal.PtrToStringUni(unmanagedString);
}
finally
{
//Clean up any memory allocation
System.Runtime.InteropServices.Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
private void Btn1_Click(object sender, RoutedEventArgs e)
{
foreach (var item in (((sender as FrameworkElement).Parent) as StackPanel).Children)
{
if (item is PasswordBox) (item as PasswordBox).Clear();
}
}
private void Btn2_Click(object sender, RoutedEventArgs e)
{
foreach (var item in (((sender as FrameworkElement).Parent) as StackPanel).Children)
{
if (item is PasswordBox)
{
(item as PasswordBox).Focus();
(item as PasswordBox).SelectAll();
}
}
}
//下面的方法有助于将字符串转换为安全字符串
//private SecureString ConvertToSecureString(string password)
//{
// if (password == null)
// throw new ArgumentNullException("password");
// var securePassword = new SecureString();
// foreach (char c in password)
// securePassword.AppendChar(c);
// securePassword.MakeReadOnly();
// return securePassword;
//}
}
}