如何通过 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 中的代码添加现有项目的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本框添加到 s-s-rS 项目中的现有矩阵?

访问大型 C/C++ 项目中的现有字段

如何通过Powershell代码更改特定WPF列表框项的背景颜色?

如何仅使用 XCode 6(无终端)将现有项目添加到 Git 控件?

如何将现有表单添加到新项目?

将新项目添加到 TFS 中的现有解决方案