【问题标题】:Access image file in Metro JS project from WinRT component project从 WinRT 组件项目访问 Metro JS 项目中的图像文件
【发布时间】:2025-12-31 03:30:14
【问题描述】:

我正在开发一个 JavaScript Metro 应用程序,我发现要从 JavaScript 调用 C# 代码,我必须在我的解决方案中使用 Windows 运行时组件项目。现在我需要检查一些添加到“images”文件夹中的 JavaScript Metro 应用程序中的图像,如果它们在那里,我需要将它们复制到应用程序本地文件夹中。

首先我尝试使用该方法

Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///images/logo.png"))

但它会引发无法找到位置/文件路径的异常。

我认为这可能是因为项目的命名空间不同。该图像已添加到 JavaScript Metro 应用程序项目中,我正在尝试从 Windows 运行时组件项目中使用它。

所以我尝试为图像文件传递一个硬编码路径,如“E://projects/myProject/myProject/images/logo.png”,并尝试使用方法

Windows.Storage.StorageFile.GetFileFromPathAsync(<passed the above path>); 

但它会抛出文件路径格式不正确的异常。

我可以从同一解决方案中的 Windows 运行时组件项目访问 JavaScript Metro 应用程序项目中添加的文件吗?并将其复制到应用程序本地文件夹中?

谢谢。

【问题讨论】:

    标签: javascript windows-8 windows-runtime microsoft-metro winrt-component


    【解决方案1】:

    这应该可以工作,我在一个新的 JS 项目中尝试了你的第一行代码,并在 C# 中使用了一个新的 WinRT 组件。它工作得很好。你能在你的组件中显示更多的整个 C# 类以及调用它的 JS 代码吗?

    这是我的测试的 .cs 代码:

    using System;
    using Windows.Storage;
    
    namespace Test2
    {
        public sealed class Class1
        {
            public async void TestAccess()
            {
                StorageFile file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///images/logo.png"));
            }
        }
    }
    

    以及调用它的 JS 代码:

    var obj = new Test2.Class1();
    obj.testAccess();            
    

    您是否也确认 logo.png 文件在您的 JS 项目中?

    【讨论】:

    • 嗨,是的,我可以访问图像文件夹,但我有另一个文件夹“www”,其中有一个子文件夹“img”,当我尝试使用 Windows.Storage 访问图像时。 StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///www/img/logo.png"));它给出了错误。我们可以只访问根文件夹而不访问子文件夹吗?
    • 应该不是问题...使用 images/ 你已经进入了包的子文件夹。一件事:在 Visual Studio 中,右键单击 logo.png 并选择属性。在“解决方案资源管理器”窗格下方显示的窗格中,检查“包操作”的内容。如果这是“无”,则图像不会与包一起复制;它必须是“内容”。