WPF项目中如何用PasswordBox实现密码显示/隐藏功能?
WPF PasswordBox 密码显隐实现方案
一、先确认PasswordBox自带的密码显隐功能
WPF的PasswordBox从.NET 4.5版本开始就自带密码显隐能力,核心是PasswordRevealMode属性,你之前的PasswordReveal方法无效,大概率是没正确配置这个属性:
PasswordRevealMode.Hidden:默认行为,始终以圆点/星号隐藏密码PasswordRevealMode.Visible:始终显示明文密码PasswordRevealMode.Peek:按住鼠标时显示明文,松开后自动恢复隐藏(类似主流浏览器密码框的效果)
XAML示例:
<PasswordBox PasswordRevealMode="Peek" Width="200" />
如果你的项目基于.NET 4.5以下版本,这个属性不存在,就得用其他方案。
二、用Checkbox实现自定义密码显隐
如果自带的PasswordRevealMode不符合需求,完全可以用Checkbox配合PasswordBox实现自定义显隐逻辑,核心思路是通过开关切换PasswordBox和一个隐藏TextBox的可见性,同时同步密码内容:
XAML示例:
<Grid> <PasswordBox x:Name="PasswordBoxControl" Width="200" PasswordChanged="PasswordBox_PasswordChanged" /> <TextBox x:Name="PasswordTextBox" Width="200" Visibility="Collapsed" /> <Checkbox Content="显示密码" Margin="0,0,0,30" VerticalAlignment="Bottom" Checked="PasswordShow_Checked" Unchecked="PasswordShow_Unchecked" /> </Grid>
后台C#代码:
private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e) { // 实时同步密码到TextBox,避免切换显隐时内容不一致 PasswordTextBox.Text = PasswordBoxControl.Password; } private void PasswordShow_Checked(object sender, RoutedEventArgs e) { PasswordTextBox.Text = PasswordBoxControl.Password; PasswordTextBox.Visibility = Visibility.Visible; PasswordBoxControl.Visibility = Visibility.Collapsed; } private void PasswordShow_Unchecked(object sender, RoutedEventArgs e) { PasswordBoxControl.Password = PasswordTextBox.Text; PasswordBoxControl.Visibility = Visibility.Visible; PasswordTextBox.Visibility = Visibility.Collapsed; }
可以把TextBox的样式改成和PasswordBox一致,保证视觉统一。
三、关于用TextBox替代的方案
如果不想用PasswordBox,也可以直接用TextBox实现密码显隐:
- 需要隐藏密码时,设置
PasswordChar="●"(或其他符号) - 需要显示时,设置
PasswordChar="\0"(空字符)
XAML示例:
<TextBox x:Name="PasswordTextBox" Width="200" PasswordChar="●" /> <Checkbox Content="显示密码" Margin="0,0,0,30" VerticalAlignment="Bottom" Checked="PasswordShow_Checked" Unchecked="PasswordShow_Unchecked" />
后台代码:
private void PasswordShow_Checked(object sender, RoutedEventArgs e) { PasswordTextBox.PasswordChar = '\0'; } private void PasswordShow_Unchecked(object sender, RoutedEventArgs e) { PasswordTextBox.PasswordChar = '●'; }
注意:TextBox的Text属性是明文存储的,而PasswordBox的Password属性是SecureString类型,敏感密码场景下PasswordBox的安全性更高。
内容的提问来源于stack exchange,提问作者yash
相关产品推荐
相关产品推荐

