【问题标题】:Use Image without adding it in WPF Project/Solution Resources使用图像而不将其添加到 WPF 项目/解决方案资源中
【发布时间】:2013-07-03 17:07:07
【问题描述】:

我正在 WPF 应用程序中为楼层构建一个画廊,我正在从 csv 文件中读取图像名称,用户将直接将图像复制到资源文件夹中。

StreamReader streamReader = new StreamReader(
    (Application.Current as PlayOnSurface.App).ProjectAmenitiesCSVPath);
// browse the csv file line by line until the end of the file
while (!streamReader.EndOfStream)
{
    // for each line, split it with the split caractere (that may no be ';')
    var splitLine = streamReader.ReadLine().Split('~');

    if (int.Parse(splitLine[0].Trim())
        == (Application.Current as PlayOnSurface.App).SelectedFloorID)
    {
        for (int i = 2; i < splitLine.Length; i++)
        {
            ImageList.Add(splitLine[i].Trim());
        }
    }
    // map the splitted line with an entity
}
streamReader.Close();

btnPrev.IsEnabled = false;
if (ImageList.Count <= 1)
    btnNext.IsEnabled = false;
imgGallery.Source = Utilities.LoadBitmapFromResource(
    "Resources/Amenities/" + ImageList[0],
    null);

实用程序代码

    public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
        {
            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            if (pathInApplication[0] == '/')
            {
                pathInApplication = pathInApplication.Substring(1);
            }
            return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute));
        }

我无法将其添加到项目的 Resources 文件夹中,也无法嵌入资源,因为我希望用户将其文件复制到 Resources 文件夹并在部署后更新 csv 文件。

我的代码将读取它并显示图库,但在这种情况下,WPF 在上述代码的imgGallery.Source 行上加载图像时会引发“无法定位资源”异常。

我的 csv 文件格式:

1~FirstFloor~img1.png~img2.png~img3.png
2~SecondFloor~img1.png~img2.png~img3.png
3~ThirdFloor~img1.png~img2.png~img3.png
4~FourthFloor~img1.png~img2.png~img3.png

【问题讨论】:

  • LoadBitmapFromResource 的代码可能很重要。
  • 如果您无论如何都无法将图像作为资源嵌入 - 您可以直接从文件系统加载它...
  • 有一个名为 TextfieldParser 的 .Net 库负责解析任何结构化文件。您需要在 Add References .NET 选项卡中添加对 Microsoft.VisualBasic 的引用。 msdn.microsoft.com/en-us/library/…
  • 试试这个:在解决方案探索中将图像“构建操作”属性设置为“资源”,然后清理解决方案并重建它。

标签: c# .net wpf


【解决方案1】:

可能使用文件绝对路径,只需将LoadBitmapFromResource函数的最后一行改成:

return new BitmapImage(new Uri(assembly.GetName().CodeBase + pathInApplication, UriKind.Absolute));

这应该可以解决问题。 您也可以尝试使用UriKind.Relative

美好的一天

【讨论】:

    【解决方案2】:

    您在 URI 方案中使用了不正确的权限。应用程序权限将用于在编译时已知的数据文件(也称为静态资源)。您必须将其替换为 siteoforigin 权限。

    我还建议您使用标准 CSV 文件替换您的自制文本文件格式。许多程序(如 Excel)默认支持生成逗号分隔的字段。虽然可以放置自定义分隔符,但它们通常需要额外的努力。读取和解析逗号分隔的文件也更容易,因为有许多库可用于执行这些任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      相关资源
      最近更新 更多