WPF C#修改图片源报错,更新用户信息遇两类异常
问题解决思路与代码修正
一、解决“Empty file name is not legal”错误
这个错误是因为未修改图片时,你调用SavePic方法传入了空的源文件路径。需要在保存逻辑中先判断是否有新图片需要处理:
- 在
addUserBtn的点击事件里,先检查用户是否选择了新图片(比如判断图片选择对话框返回的路径是否为空)。 - 只有存在有效图片路径时,才执行
SavePic保存逻辑;否则直接复用数据库中已有的图片路径。
示例代码片段:
private void addUserBtn_Click(object sender, RoutedEventArgs e) { var selectedUser = dataGrid.SelectedItem as User; // newImagePath是用户选择的新图片路径,未选择则为空 bool isImageChanged = !string.IsNullOrEmpty(newImagePath); if (isImageChanged) { string savedPath = SavePic(newImagePath); selectedUser.Image = savedPath; } // 未修改图片时,保留原Image字段值,不执行图片保存 // 保存其他字段到数据库 dbContext.Users.Update(selectedUser); dbContext.SaveChanges(); }
二、解决“文件被其他进程占用”错误
这个问题通常是Image控件未释放对原图片文件的占用,或保存图片时流未正确关闭。可以通过以下两种方式解决:
方式1:加载图片时用流释放资源
在Update菜单点击事件中,加载数据库中的图片路径时,使用FileStream并设置缓存选项,确保加载后释放文件:
private void UpdateMenuItem_Click(object sender, RoutedEventArgs e) { var selectedUser = dataGrid.SelectedItem as User; if (selectedUser == null) return; if (!string.IsNullOrEmpty(selectedUser.Image)) { using (var fs = new FileStream(selectedUser.Image, FileMode.Open, FileAccess.Read)) { var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.CacheOption = BitmapCacheOption.OnLoad; // 关键:加载完成后释放文件锁 bitmap.StreamSource = fs; bitmap.EndInit(); userImageControl.Source = bitmap; } } else { // 设置项目内默认图片 userImageControl.Source = new BitmapImage(new Uri("pack://application:,,,/YourProjectName;component/Images/default.png")); } // 填充其他TextBox字段 nameTextBox.Text = selectedUser.Name; userNameTextBox.Text = selectedUser.UserName; }
方式2:修改SavePic方法避免文件占用
用流复制替代File.Copy,同时提前判断空路径:
private string SavePic(string sourcePath) { if (string.IsNullOrEmpty(sourcePath)) return string.Empty; string targetDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UserImages"); Directory.CreateDirectory(targetDir); // 确保目标目录存在 string fileName = Path.GetFileName(sourcePath); string targetPath = Path.Combine(targetDir, fileName); // 用流复制,避免File.Copy的文件锁定问题 using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var targetStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) { sourceStream.CopyTo(targetStream); } return targetPath; }
三、额外注意事项
- 默认图片使用项目资源路径(
pack://application:,,,/...),而非本地文件路径,避免不必要的文件占用。 - 用户取消图片选择时,要将
newImagePath重置为空,避免传入无效路径触发错误。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

