首页 > 解决方案 > 如何通过保存在 WPF 应用程序输出目录中的文件对话框使用上传的图像文件?

问题描述

我有一个关于在将文件复制到程序调试目录后包含文件的问题。

我有一个 WPF 数据网格,在这个数据网格中,我显示了一个包含列名称、年龄和照片的员工列表。我可以双击一行打开一个新窗口来更新详细信息,其中包括照片。

在我的项目目录中,我有这些文件夹,这些文件夹已包含在我的项目中。默认文件夹由默认员工照片的 .jpg 文件组成,userData 文件夹将用于存储用户上传的照片。

在我的.csproj文件中,我包含了这个:

<ItemGroup>
  <Content Include="img\**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

这可确保img在构建时将文件夹复制到输出目录。我还在文件夹中添加了一个.txt文件,userData否则它不会复制文件夹。

当用户上传照片并在我的程序中点击保存时,它会做两件事:

  1. 将文件从源复制到相对路径的输出目录img\userData\filename.jpg
  2. 更新该员工照片路径的 SQLite 记录,例如从img\default\staffmember1default.jpgimg\userData\newstaffmember1.jpg

我的程序目前没有更新数据网格以反映更改,因此在关闭和运行程序时,它会为发生照片更改的工作人员显示一张空白照片。但是,如果我将该照片复制到img\userData我的项目中包含的目录中并重新加载它可以工作的程序。

有没有办法解决这个问题并允许它显示userData目录中的新照片?这整个方法是否合适,还是有更好的方法来处理整个过程?

标签: c#wpfvisual-studio

解决方案


查看@Clemens 链接后,这是我想出的解决方案,似乎可以解决问题。

private void uploadButton_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();

    if(openFileDialog.ShowDialog() == true)
    {
        string filepath = openFileDialog.FileName;
        string filename = openFileDialog.SafeFileName;

        string local_path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        string parent_path = local_path + @"\ProjectName";
        string child_path = parent_path + @"\user";

        if(!System.IO.Directory.Exists(parent_path))
        {
            System.IO.Directory.CreateDirectory(parent_path);
        }

        if(!System.IO.Directory.Exists(child_path))
        {
            System.IO.Directory.CreateDirectory(child_path);
        }

        string target_path = child_path + @"\" + filename;
        File.Copy(filepath, target_path);
        photoBox.Source = new BitmapImage(new Uri(target_path));
        staff.photo_path = target_path;
    }
}

因此,我决定在本地 AppData 中进行,而不是将文件复制到程序的输出目录。文件路径也被存储在 SQLite 数据库中,这样在加载时发现图像很好。


推荐阅读