WPF 授权码显示密文并支持换行

💡 原文中文,约5800字,阅读约需14分钟。
📝

内容提要

这篇文章介绍了如何在WPF中创建一个多行密码输入框。由于PasswordBox控件不支持换行输入,作者使用TextBox控件并通过自定义逻辑代码来实现多行输入和密码掩码。文章提供了相关的代码示例和使用方法。

🔎

延伸解读

为何选择自定义控件而非 PasswordBox

WPF 自带的 PasswordBox 设计为单行输入,无法直接支持换行。当授权码需要多行输入时,开发者只能放弃 PasswordBox,转而基于 TextBox 扩展。本文通过继承 TextBox 并重写文本处理逻辑,实现了多行密码掩码输入,既保留了 TextBox 的多行能力,又达到了隐藏明文的效果。

核心机制:文本差异与掩码重建

控件通过比较当前文本与上一次文本的长度差异来判断输入或删除操作,并据此更新内部密码缓冲区。每次文本变化后,都会根据缓冲区内容重新生成掩码文本,同时保留换行符。这一机制确保了掩码显示与真实密码的同步,但也意味着每次输入都会触发全文本重建,在长文本下可能带来性能开销。

使用注意:光标与换行处理

代码中通过记录并恢复 CaretIndex 来保持光标位置,避免因文本替换导致光标跳转。同时,CreateMaskedTextWithLineBreaks 方法会保留 \r 和 \n 字符,使换行符不被掩码替换。开发者在使用时需注意,若密码中包含换行符,PlainText 属性将包含这些换行符,需在后续处理中妥善处理。

❓

Q&A

如何在WPF中创建多行密码输入框?

可以使用TextBox控件并通过自定义逻辑实现多行输入和密码掩码,创建一个继承自TextBox的MultiLinePasswordBox控件。

为什么不能使用PasswordBox控件实现多行输入?

因为PasswordBox控件设计为单行输入控件,不支持换行功能。

MultiLinePasswordBox控件的主要功能是什么?

MultiLinePasswordBox控件可以实现多行输入,并将输入的字符以密码字符显示,同时支持换行。

如何处理MultiLinePasswordBox中的文本变化?

通过订阅TextChanged事件,使用PasswordTextBox_TextChanged方法处理文本变化,更新密码掩码并保持光标位置。

MultiLinePasswordBox控件的构造函数设置了哪些属性?

构造函数设置了AcceptsReturn为true以支持换行,TextWrapping为Wrap以支持多行显示。

如何创建带有掩码和换行符的文本?

使用CreateMaskedTextWithLineBreaks方法,该方法遍历输入文本并根据需要添加掩码和换行符。

🏷️

标签

➡️

继续阅读