You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Blazor中SfTextBox密码框可见性切换图标不生效问题

解决.NET MAUI Blazor中SfTextBox密码图标切换失效问题

问题根源

你代码里的图标类混用了不同的图标库:初始通过C#添加的是Syncfusion自带的e-eye类(属于e-icons系列),但JavaScript里却在切换Font Awesome的fa-eye/fa-eye-slash类,两者完全不匹配,所以点击后图标无变化。同时密码框的Type属性也没有同步更新,密码可见性控制也会失效。

修复方案

统一使用Syncfusion图标库(无需额外引入Font Awesome),同时同步更新密码框类型和图标类:

1. 修正C#代码

首先确保定义好绑定变量,调整图标添加和点击逻辑:

// 定义绑定变量
private InputType TextBoxType { get; set; } = InputType.Password;
private bool IsPasswordVisible { get; set; } = false;
private SfTextBox TextBoxPasswordObj { get; set; }

public async Task AddPwdIcon() 
{ 
    // 添加Syncfusion的眼睛图标
    await TextBoxPasswordObj.AddIconAsync("append", "e-icons e-eye", new Dictionary<string, object>()
    { 
        { "onclick", EventCallback.Factory.Create<MouseEventArgs>(this, TogglePasswordVisibility) } 
    }); 
}

public async Task TogglePasswordVisibility()
{
    IsPasswordVisible = !IsPasswordVisible;
    // 同步切换密码框类型
    TextBoxType = IsPasswordVisible ? InputType.Text : InputType.Password;
    // 更新图标类
    await UpdatePasswordIcon();
}

private async Task UpdatePasswordIcon()
{
    // 先移除原有图标,再添加对应状态的图标
    await TextBoxPasswordObj.RemoveIconAsync("append");
    var iconClass = IsPasswordVisible ? "e-icons e-eye-slash" : "e-icons e-eye";
    await TextBoxPasswordObj.AddIconAsync("append", iconClass, new Dictionary<string, object>()
    {
        { "onclick", EventCallback.Factory.Create<MouseEventArgs>(this, TogglePasswordVisibility) }
    });
}

2. 移除冗余JavaScript代码

上面的C#逻辑已经直接处理了图标切换和密码类型变更,不需要原来的JavaScript代码,可以删除showhidePassword函数。

3. 保留原有SfTextBox绑定

你的原有Blazor代码已经绑定了Type="@TextBoxType",这部分保持不变即可。

替代方案(保留JavaScript操作)

如果偏好通过JS处理DOM,修正JS代码操作正确的Syncfusion图标类:

function showhidePassword(textBoxId) {
    const textBox = document.getElementById(textBoxId);
    const icon = textBox.parentElement.querySelector('.e-input-group-icon .e-icons');
    // 切换Syncfusion的图标类
    icon.classList.toggle('e-eye');
    icon.classList.toggle('e-eye-slash');
    // 同步切换密码框类型
    textBox.type = textBox.type === 'password' ? 'text' : 'password';
}

同时修改C#的PasswordClick方法:

public async Task PasswordClick()
{
    await _JSRuntime.InvokeAsync<object>("showhidePassword", "passwordBox");
    IsPasswordVisible = !IsPasswordVisible;
}

关键注意事项

  • 确保项目中已正确引入Syncfusion的图标样式(通常通过NuGet包或CDN自动包含)。
  • 避免混用不同图标库的类名,保持图标类的一致性。

内容的提问来源于stack exchange,提问作者Lasitha Lankajeewa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:45:16