WPF密码可见性切换时VisibilityOff.png图像无法正常显示
WPF密码框可见性切换图标异常问题解决方案
可能原因及解决步骤
1. 路径与文件名校验
- 严格匹配文件名大小写:WPF的pack URI对大小写敏感,确保代码中的
VisibilityOff.png和实际文件名完全一致(包括大小写)。 - 确认目录结构:检查项目中
img文件夹是否存在,且VisibilityOff.png确实放在该目录下,无嵌套错误。
2. 修正BitmapImage加载逻辑
后台直接创建BitmapImage时,未设置缓存选项可能导致加载失败,修改为:
PasswordEyeIcon.Source = new BitmapImage(new Uri("pack://application:,,,/img/VisibilityOff.png", UriKind.Absolute)) { CacheOption = BitmapCacheOption.OnLoad };
更稳妥的方式是提前在XAML资源字典中定义图像,后台直接引用:
XAML添加资源:
<Window.Resources> <BitmapImage x:Key="VisibilityIcon" UriSource="pack://application:,,,/img/Visibility.png"/> <BitmapImage x:Key="VisibilityOffIcon" UriSource="pack://application:,,,/img/VisibilityOff.png"/> </Window.Resources>
后台代码修改:
PasswordEyeIcon.Source = (BitmapImage)FindResource("VisibilityOffIcon");
3. 检查图像文件完整性
- 用图片查看器打开
VisibilityOff.png,确认文件未损坏;若损坏,替换为正常图像文件。 - 确认图像格式为WPF支持的类型(如PNG、JPG),无特殊编码问题。
4. 确认资源属性设置
右键VisibilityOff.png → 属性:
- 生成操作设置为
Resource - 复制到输出目录设置为
不复制(资源已嵌入程序集,无需复制到输出目录)
优化后完整代码示例
XAML部分:
<Window.Resources> <BitmapImage x:Key="VisibilityIcon" UriSource="/img/Visibility.png"/> <BitmapImage x:Key="VisibilityOffIcon" UriSource="/img/VisibilityOff.png"/> </Window.Resources> <Image x:Name="PasswordEyeIcon" Source="{StaticResource VisibilityIcon}" Width="20" Height="20" Margin="0,0,10,0" VerticalAlignment="Center" HorizontalAlignment="Right" Cursor="Hand" MouseDown="PasswordEyeIcon_MouseDown"/>
后台代码:
private bool isPasswordVisible = false; private void PasswordEyeIcon_MouseDown(object sender, MouseButtonEventArgs e) { if (isPasswordVisible) { PasswordTextBox.Visibility = Visibility.Collapsed; PasswordBox.Visibility = Visibility.Visible; PasswordBox.Password = PasswordTextBox.Text; PasswordEyeIcon.Source = (BitmapImage)FindResource("VisibilityIcon"); isPasswordVisible = false; } else { PasswordTextBox.Text = PasswordBox.Password; PasswordBox.Visibility = Visibility.Collapsed; PasswordTextBox.Visibility = Visibility.Visible; PasswordEyeIcon.Source = (BitmapImage)FindResource("VisibilityOffIcon"); isPasswordVisible = true; } }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

