PasswordBox控件本身是没有办法显示自己输入的文本。只能通过一定的辅助事件才能看到。
这是我的界面:
在这里我通过旁边的眼睛按钮来辅助passwordbox控件显示其原本密码。
这里的定义了MouseLeftButtonDown和MouseLeftButtonUp事件
<Button x:Name="SeePwd" MouseLeftButtonDown="SeePwd_MouseLeftButtonDown" MouseLeftButtonUp="SeePwd_MouseLeftButtonUp"/>
原理:通过眼睛按钮的抬起与按下事件,让位置跟passwordbox重叠的textbox显示出来,并让passwordbox数据显示到textbook控件中。
代码如下
//小眼睛按钮的按下和谈起事件
private void SeePwd_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
text.ButtonDown(Pwd, TxtPwd);
}
private void SeePwd_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
text.ButtonUp(Pwd, TxtPwd);
}
//具体代码封装成了工具类
/// <summary>
/// 鼠标抬起事件
/// </summary>
/// <param name="pwd"></param>
/// <param name="txt"></param>
public void ButtonUp(PasswordBox pwd, TextBox txt)
{
pwd.IsEnabled = true;
pwd.Visibility = Visibility.Visible;
txt.IsEnabled = false;
txt.Visibility = Visibility.Hidden;
}
/// <summary>
/// 鼠标按下事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ButtonDown(PasswordBox pwd, TextBox txt)
{
txt.Text = pwd.Password;
txt.IsEnabled = true;
txt.Visibility = Visibility.Visible;
pwd.IsEnabled = false;
pwd.Visibility = Visibility.Hidden;
}
存在问题:
如果正常的写,程序中无法响应这个事件,打了断点才发现根本就没有走这个事件。
解决方法:
查看了一些资料,才知道这是一个设计原则上的问题。控件在捕获了MouseLeftButtonDown事件后,会将该事件的“Handled”设置为True,这个属性是用在事件路由中的,当某个控件得到一个RoutedEvent,就会检测Handled是否为true,为true则忽略该事件。并且,控件本身的Click事件,相当于将MouseLeftButtonDown事件抑制(Supress)掉了,转换成了Click事件。所以,如果一定要使用这个事件的话,需要在初始化的函数里利用UIElement的AddHandler方法,显式的增加这个事件。
在程序的页面初始化时加上AddHandler方法。
public ModefiyPwd()
{
InitializeComponent();
SeePwd.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.SeePwd_MouseLeftButtonDown), true);
SeePwd.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.SeePwd_MouseLeftButtonUp), true);
}