WPF基础五:UI②内容元素PasswordBox

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值