如何通过 wpf 中的代码添加现有项目
Posted
技术标签:
【中文标题】如何通过 wpf 中的代码添加现有项目【英文标题】:How to add an existing item via code in wpf 【发布时间】:2020-07-29 02:31:52 【问题描述】:我正在尝试将选定的图像复制到一个文件夹,然后想用 Image 对象显示它。复制工作正常,但是当我想显示它时,程序似乎找不到它。仅当我手动使用“添加现有项目”时才显示图像。有没有办法自动添加?
这是我的代码:
string name = "image1";
OpenFileDialog dialog = new OpenFileDialog();
Nullable<bool> dialogOK = dialog.ShowDialog();
if(dialogOK == true)
File.Copy(dialog.FileName, @"..\..\Images\" + name + ".png", true);
image.Source = new BitmapImage(new Uri(@"Images\" + name + ".png", UriKind.Relative));
(“图像”在 xaml 中定义)
【问题讨论】:
是否确实将图像复制到正确的文件夹中(即:不是项目文件夹,而是 bin 文件夹下的 debug/release 文件夹中的那个)? 为什么不将文件加载为字节数组并用它创建一个 BitmapImage? @Slipoch 这是正确的文件夹。我对它进行了测试,它只有在我手动添加现有项目时才有效。 @SotirisKoukios-Panopoulos 你能举个例子吗? 【参考方案1】:使用绝对路径加载 BitmapImage 似乎更安全:
var dialog = new OpenFileDialog();
if (dialog.ShowDialog() == true)
var targetFile = @"..\..\Images\" + name + ".png";
var currentDir = Environment.CurrentDirectory;
var targetPath = Path.Combine(currentDir, targetFile);
var targetDir = Path.GetDirectoryName(targetPath);
Directory.CreateDirectory(targetDir);
File.Copy(dialog.FileName, targetPath, true);
image.Source = new BitmapImage(new Uri(targetPath));
为了在加载 BitmapImage 后直接释放文件,从 FileStream 加载它:
BitmapImage bitmap = new BitmapImage();
using (var stream = File.OpenRead(targetPath))
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
image.Source = bitmap;
【讨论】:
感谢您的帮助!我已经尝试过类似的事情(给出绝对路径@“C:\ Users \ ...”)。问题是当我想删除带有File.Delete(@"C:\Users\...")
的图像时,我收到一个错误,因为该路径当前被图片使用。即使我设置了“image.Source = null”,垃圾收集器也不会删除它。但是当我使用相对路径时,这个错误不会出现,但我遇到了上面描述的问题。那么有没有办法用相对路径来做到这一点? @克莱门斯
相对路径无济于事。查看编辑后的答案,或在这里:***.com/a/13265190/1136211
非常感谢。那是缺少的一块!只是出于好奇,这条线是做什么用的? Directory.CreateDirectory(targetDir);
它创建目标路径的所有子目录,以防它们不存在。所以这不是绝对必要的。
再次感谢克莱门斯!以上是关于如何通过 wpf 中的代码添加现有项目的主要内容,如果未能解决你的问题,请参考以下文章
如何通过Powershell代码更改特定WPF列表框项的背景颜色?