WPF TextBox模仿PasswordBox的密码显示功能

WPF TextBox模仿PasswordBox的密码显示功能WPFTextBox显示密码,模仿PasswordBox的功能

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

WPF TextBox模仿PasswordBox的密码显示功能

这并不是多此一举,因为WPF的PasswordBox不支持继承,所以想扩展PasswordBox的属性就没法实现,所以有了本文内容,当然这个思路也可以扩展到其他语言。

已经更新了升级版,链接如下升级版链接
https://blog.csdn.net/qq_41908152/article/details/122067744

一、添加属性 Password,用于存储密码

public string Password { 
    get; set; } = string.Empty;

二、添加属性 PasswordChar,用于设置显示为密码的字符,默认为 ‘●’

public char PasswordChar { 
    get; set; } = '●';

三、重写TextBox的TextChanged事件事件,代码以及内部逻辑如下(用户有可能往密码框里粘贴密码,以下代码已全部考虑到了此操作)

//重写文本框内容改变事件
protected override void OnTextChanged(TextChangedEventArgs e)
{ 

base.OnTextChanged(e);
//已键入的文本长度 Text 为 TextBox 的属性(获取或设置文本框的文本内容)
int textLength = Text.Length;
//已保存的密码长度
int psdLength = Password.Length;
//起始修改位置
int startIndex = -1;
for (int i = 0; i < textLength; i++)
{ 

if (Text[i] != PasswordChar)
{ 

startIndex = i;
break;
}
}
//未作任何修改
if (startIndex == -1 && textLength == psdLength) return;
//结束修改位置
int stopIndex = -1;
for (int i = textLength - 1; i >= 0; i--)
{ 

if (Text[i] != PasswordChar)
{ 

stopIndex = i;
break;
}
}
//添加或修改了一个或连续的多个值
if (startIndex != -1)
{ 

//累计修改长度
int alterLength = stopIndex - startIndex + 1;
//长度没变化,单纯的修改了一个或连续的多个值
if (textLength == psdLength)
{ 

Password = Password.Substring(0, startIndex) + Text.Substring(startIndex, alterLength) + Password.Substring(stopIndex + 1);
}
//新增了内容
else
{ 

//新增且修改了原来内容
if (alterLength > textLength - psdLength)
{ 

//计算未修改密码个数 textLength - alterLength
//计算已修改密码个数 = 原密码长度 - 未修改密码个数 psdLength - (textLength - alterLength)
//原密码该保留的后半部分的索引 = 已修改密码个数 + 起始修改位置
Password = Password.Substring(0, startIndex) + Text.Substring(startIndex, alterLength) + Password.Substring(psdLength - (textLength - alterLength) + startIndex);
}
//单纯的新增了一个或多个连续的值
else
{ 

Password = Password.Substring(0, startIndex) + Text.Substring(startIndex, alterLength) + Password.Substring(startIndex);
}
}
}
//删除了一个或连续的多个值
else
{ 

//已删除的数据长度 SelectionStart 为 TextBox 的属性(获取或设置当前所选内容的起始位置的字符索引)
int length = psdLength - textLength;
if (SelectionStart < textLength)
{ 

//改变了中间的数据
Password = Password.Substring(0, SelectionStart) + Password.Substring(SelectionStart + length);
}
else
{ 

//删除了结尾的数据
Password = Password.Substring(0, SelectionStart);
}
}
//记住光标位置(设置完Text后会丢失,所以现在要记住)
int selectionStart = SelectionStart;
//设置显示密码
Text = new string(PasswordChar, textLength);
//设置光标位置
SelectionStart = selectionStart;
}

怕有些初学者迷茫,把完整的类也贴出来吧(这是创建了一个“自定义控件”),虽然没啥东西(包含上述代码)

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 SuperControl
{ 

public class SuperPasswordBox : TextBox
{ 

static SuperPasswordBox()
{ 

DefaultStyleKeyProperty.OverrideMetadata(typeof(SuperPasswordBox), new FrameworkPropertyMetadata(typeof(TextBox)));
}
/// <summary>
/// 密码
/// </summary>
public string Password { 
 get; set; } = string.Empty;
/// <summary>
/// 显示为密码的字符
/// </summary>
public char PasswordChar { 
 get; set; } = '●';
//重写文本框内容改变事件
protected override void OnTextChanged(TextChangedEventArgs e)
{ 

base.OnTextChanged(e);
//已键入的文本长度
int textLength = Text.Length;
//已保存的密码长度
int psdLength = Password.Length;
//起始修改位置
int startIndex = -1;
for (int i = 0; i < textLength; i++)
{ 

if (Text[i] != PasswordChar)
{ 

startIndex = i;
break;
}
}
//未作任何修改
if (startIndex == -1 && textLength == psdLength) return;
//结束修改位置
int stopIndex = -1;
for (int i = textLength - 1; i >= 0; i--)
{ 

if (Text[i] != PasswordChar)
{ 

stopIndex = i;
break;
}
}
//添加或修改了一个或连续的多个值
if (startIndex != -1)
{ 

//累计修改长度
int alterLength = stopIndex - startIndex + 1;
//长度没变化,单纯的修改了一个或连续的多个值
if (textLength == psdLength)
{ 

Password = Password.Substring(0, startIndex) + Text.Substring(startIndex, alterLength) + Password.Substring(stopIndex + 1);
}
//新增了内容
else
{ 

//新增且修改了原来内容
if (alterLength > textLength - psdLength)
{ 

//计算未修改密码个数 textLength - alterLength
//计算已修改密码个数 = 原密码长度 - 未修改密码个数 psdLength - (textLength - alterLength)
//原密码该保留的后半部分的索引 = 已修改密码个数 + 起始修改位置
Password = Password.Substring(0, startIndex) + Text.Substring(startIndex, alterLength) + Password.Substring(psdLength - (textLength - alterLength) + startIndex);
}
//单纯的新增了一个或多个连续的值
else
{ 

Password = Password.Substring(0, startIndex) + Text.Substring(startIndex, alterLength) + Password.Substring(startIndex);
}
}
}
//删除了一个或连续的多个值
else
{ 

//已删除的数据长度
int length = psdLength - textLength;
if (SelectionStart < textLength)
{ 

//改变了中间的数据
Password = Password.Substring(0, SelectionStart) + Password.Substring(SelectionStart + length);
}
else
{ 

//删除了结尾的数据
Password = Password.Substring(0, SelectionStart);
}
}
//记住光标位置(设置完Text后会丢失,所以现在要记住)
int selectionStart = SelectionStart;
//设置显示密码
Text = new string(PasswordChar, textLength);
//设置光标位置
SelectionStart = selectionStart;
}
}
}

有问题欢迎留言,如果觉得有用请点个”赞”,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161476.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【三万粉丝终极福利】Python、C、Java三大语言学习路线和资源整理

    大家好,我是辣条。今天给大家带来三万粉丝三大语言学习路线和资源整理,收藏就对了。目录C语言学习路线学习书籍学习视频资源推荐Java语言学习路线学习书籍学习视频资源推荐Python语言学习路线学习书籍学习视频资源推荐C语言学习路线学习书籍学习视频资源推荐Java语言学习路线学习书籍学习视频资源推荐Python语言学习路线学习书籍学习视频资源推荐

  • PCIE接口定义[通俗易懂]

    PCIE接口定义[通俗易懂]PCIExpress(PCIe,PCI-e)isahigh-speedserialcomputerexpansionbusstandard.PCIExpressasahigh-bandwidth,lowpincount,serial,interconnecttechnology.Itwasdesignedtoreplacetheol…

  • 大数据云计算和物联网之间的区别和联系_云计算和大数据的区别

    大数据云计算和物联网之间的区别和联系_云计算和大数据的区别一、概念1.云计算“云”指通过计算机池提供资源,也就是说,不是构建一两台机器的问题,而是要构建一定规模的集群,并且对该集群统一管理,形成”资源池“,才能满足云计算业务的需求。简单地说,**云计算就是基于互联网将规模化资源池的计算、存储、平台开发和软件能力提供给用户,实现自动化、低成本、快速提供和灵活伸缩的IT服务。**云计算代表了以虚拟化技术为核心、以低成本为目标的、动态可扩展的…

  • LoadRunner11.00安装&使用教程[通俗易懂]

    LoadRunner11.00安装&使用教程[通俗易懂]本教程分为四部分内容:安装序言:由于LoadRunner12.02或者12.53版本是HP公司推出的自带免费50个虚拟用户进行压力测试的版本,目的为了工程师去学习与了解的该工具。为了增大压力(增加虚拟用户数)到达高并发的性能测试,采用LoadRunner11.00,增加对应的Lice…

  • UML——类图

    UML——类图UML——类图

  • native2ascii 用法_native to

    native2ascii 用法_native toDK native2ascii工具用法(2010-01-2814:25:30)转载标签:it分类:JAVA地带背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode,而我们的计算机系统编码常常是GBK等编码…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号