当前位置: 首页 > news >正文

WPF密码输入框明文掩码切换

1,效果

 

2,代码:

        WPF的PasswordBox不能像Winform中的PasswordBox那样,通过PasswordBox.PasswordChar=(char)0显示明文。所以这里使用无外观控件构筑掩码明文切换。

无外观控件遵守Themes/Generic.xaml文件配置.

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:StudentInfoManagerWPF"><Style TargetType="{x:Type local:PasswordBoxExt}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:PasswordBoxExt}"><Grid><PasswordBox  x:Name="Part_Pwd"  VerticalContentAlignment="Center" Padding="0,0,30,0"  PasswordChar="{TemplateBinding PasswordChar}"></PasswordBox><TextBox x:Name="Part_TxtBox" VerticalContentAlignment="Center" Padding="0,0,30,0" Visibility="Collapsed" Text="{Binding RelativeSource={RelativeSource  Mode=FindAncestor,   AncestorType=local:PasswordBoxExt, AncestorLevel=1}, Path=Password}"></TextBox><ToggleButton x:Name="Part_Toggle"  HorizontalAlignment="Right" MaxWidth="30" ><ToggleButton.Template><ControlTemplate TargetType="ToggleButton"><Grid><Image x:Name="Part_ImgShow" Source="/icon/1.png" Visibility="Collapsed"></Image><Image x:Name="Part_ImgHide" Source="/Icon/2.png" Visibility="Visible"></Image></Grid><ControlTemplate.Triggers ><Trigger Property="IsChecked" Value="true"><Setter Property="Visibility" Value="Visible" TargetName="Part_ImgShow"></Setter><Setter Property="Visibility" Value="Collapsed" TargetName="Part_ImgHide"></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate></ToggleButton.Template></ToggleButton></Grid><ControlTemplate.Triggers><Trigger SourceName="Part_Toggle" Property="IsChecked" Value="true"><Setter TargetName="Part_TxtBox" Property="Visibility" Value="Visible"></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>
public class PasswordBoxExt : Control{public static readonly DependencyProperty PasswordProperty;public static readonly DependencyProperty PasswordCharProperty;PasswordBox passwordBox;static PasswordBoxExt(){DefaultStyleKeyProperty.OverrideMetadata(typeof(PasswordBoxExt), new FrameworkPropertyMetadata(typeof(PasswordBoxExt)));PasswordProperty = DependencyProperty.Register("Password", typeof(string), typeof(PasswordBoxExt),new PropertyMetadata(new PropertyChangedCallback(PasswordPropertyChanged)));PasswordCharProperty = DependencyProperty.Register("PasswordChar", typeof(char), typeof(PasswordBoxExt), new PropertyMetadata('*'));}private static void PasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){//如此每次变化均导致passwordbox被重新覆盖新值,致使光标每次置于字符串首位而不是字符串末尾//if( (d as PasswordBoxExt).passwordBox != null)// {//     (d as PasswordBoxExt).passwordBox.Password = e.NewValue.ToString();// }}/// <summary>/// 密码/// </summary>public string Password{get{return (string)GetValue(PasswordProperty);}set{SetValue(PasswordProperty, value);}}/// <summary>/// 掩码字符/// </summary>public char PasswordChar{get{return (char)GetValue(PasswordCharProperty);}set{SetValue(PasswordCharProperty, value);}}public override void OnApplyTemplate(){base.OnApplyTemplate();passwordBox=  this.GetTemplateChild("Part_Pwd") as PasswordBox;ToggleButton btn = this.GetTemplateChild("Part_Toggle") as ToggleButton;if (passwordBox != null){passwordBox.PasswordChanged += Pwdbox_PasswordChanged;}if (btn != null){btn.Click += Btn_Click;}}private void Btn_Click(object sender, RoutedEventArgs e){if((sender as ToggleButton).IsChecked == false){passwordBox.Password = Password;}}private void Pwdbox_PasswordChanged(object sender, RoutedEventArgs e){if(sender is PasswordBox){Password = (sender as PasswordBox).Password;}}}

添加自定义控件

<DockPanel  Grid.Row="2" Grid.Column="1"  VerticalAlignment="Center"><TextBlock Text="密码:"  DockPanel.Dock="Left"   FontSize="16"></TextBlock><local:PasswordBoxExt x:Name="pwd01" PasswordChar="#" DockPanel.Dock="Right"  MinHeight="30" Margin="10,0,0,0"></local:PasswordBoxExt></DockPanel>

http://www.lryc.cn/news/352293.html

相关文章:

  • SaaS架构详细介绍及一个具体实现的示例
  • 四川音盛佳云电子商务有限公司正规吗?靠谱吗?
  • C++ 写的_string类,兼容std::string, MFC CString和 C# 的string
  • 【揭开深度学习之核:反向传播算法简析】
  • Web3 知识体系架构图
  • SQL、Mongo、Redis一般适用于那些场景
  • 学习图形推理
  • plsql 学习
  • 如何远程连接默认端口?
  • 现代C++ 如何使用 Lambda 使代码更具表现力、更容易理解?
  • LeetCode 2644.找出可整除性得分最大的整数:暴力模拟(两层循环)
  • Python列表,元组,集合,字典详解一篇搞懂
  • Postgresql源码(132)分布式行锁的原理分析
  • 前端 防抖和节流
  • C语言 | Leetcode C语言题解之第109题有序链表转换二叉搜索树
  • 【DevOps】Linux 下安装配置 Apache 服务器:打造你的专属 Web 平台
  • 23种设计模式之一————外观模式详细介绍与讲解
  • 202109青少年软件编程(Python)等级考试试卷(四级)
  • 正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-17讲 定时器按键消抖
  • 【系统架构师】-论文考点整理
  • Android Activity 设计详解
  • 国家开放大学,javaScript程序设计-形考任务-实训五:设计登录和注册页|实训六:设计简单的购物车
  • 微服务可用性之隔离
  • 设计模式——概述
  • #P0564. 数组元素查找升级版
  • 如何修改WordPress网站的域名
  • python爬虫[简易版]
  • 128天的创意之旅:从初心到成就,我的博客创作纪念日回顾
  • 前端绘制流程节点数据
  • 2024年顶级算法-黑翅鸢优化算法(BKA)-详细原理(附matlab代码)