You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取TextBox中TextChanged事件新增文本及同步文本与变量

解决TextBox文本同步与自定义密码框的问题

嘿,我来帮你搞定这两个需求!咱们逐个拆解:

一、从TextChangedEventArgs.Changes中获取新增的字符串

你已经拿到了变更的索引、新增/删除长度,其实要获取新增的内容很简单——直接从TextBox的当前文本里截取对应位置的片段就行。

核心思路:

TextChangedEventArgs.Changes返回的是一个TextChange集合,每个TextChange对象包含:

  • StartIndex:变更发生的起始位置
  • AddedLength:新增文本的长度
  • RemovedLength:被删除文本的长度

AddedLength > 0时,新增的字符串就是当前TextBox文本中从StartIndex开始、长度为AddedLength的子串。

代码示例:

private void YourTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = sender as TextBox;
    if (textBox == null) return;

    foreach (var change in e.Changes)
    {
        // 只处理有新增内容的变更
        if (change.AddedLength > 0)
        {
            string addedText = textBox.Text.Substring(change.StartIndex, change.AddedLength);
            // 这里拿到新增的文本后,就可以同步到你的变量里了
            Console.WriteLine($"新增内容:{addedText}");
        }
    }
}

⚠️ 注意:如果用户一次粘贴了大量文本,或者有多个连续变更,Changes集合可能会有多个条目,所以建议遍历整个集合处理。


二、自定义可显示真实密码的密码框

要实现“不直接同步TextBox内容,通过函数切换显示真实密码/掩码”的效果,核心是自己维护真实密码的变量,让TextBox只负责显示掩码(或临时显示真实密码)。

实现步骤:

  1. 声明一个私有变量存储真实密码,再加一个标志位避免循环触发TextChanged事件
  2. 在TextBox的TextChanged事件中,根据变更更新真实密码,然后将TextBox的文本重置为掩码
  3. 写一个切换函数,控制TextBox显示真实密码还是掩码

完整代码示例:

private string _realPassword = string.Empty;
private bool _isUpdating = false; // 避免循环触发TextChanged

private void PasswordTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = sender as TextBox;
    if (textBox == null || _isUpdating) return;

    _isUpdating = true;

    foreach (var change in e.Changes)
    {
        // 先处理删除操作
        if (change.RemovedLength > 0)
        {
            if (change.StartIndex < _realPassword.Length)
            {
                _realPassword = _realPassword.Remove(change.StartIndex, change.RemovedLength);
            }
        }

        // 再处理新增操作
        if (change.AddedLength > 0)
        {
            string addedText = textBox.Text.Substring(change.StartIndex, change.AddedLength);
            _realPassword = _realPassword.Insert(change.StartIndex, addedText);
        }
    }

    // 将TextBox重置为掩码显示
    textBox.Text = new string('*', _realPassword.Length);
    // 确保光标位置正确
    textBox.SelectionStart = textBox.Text.Length;

    _isUpdating = false;
}

// 切换显示真实密码/掩码的函数
public void ToggleShowPassword()
{
    var textBox = PasswordTextBox;
    if (textBox == null) return;

    _isUpdating = true;
    if (textBox.Text.Contains('*'))
    {
        // 显示真实密码
        textBox.Text = _realPassword;
    }
    else
    {
        // 恢复掩码显示
        textBox.Text = new string('*', _realPassword.Length);
    }
    textBox.SelectionStart = textBox.Text.Length;
    _isUpdating = false;
}

补充说明:

  • 这个方案完全脱离了TextBox自带的PasswordChar属性,所有密码逻辑都由我们自己的_realPassword变量控制,避免了TextBox直接同步真实密码的问题
  • 处理了光标位置,确保用户输入时体验和普通TextBox一致
  • 标志位_isUpdating很重要,防止我们重置TextBox文本时再次触发TextChanged事件,造成死循环

内容的提问来源于stack exchange,提问作者Dolev Goaz

火山引擎 最新活动