Silverlight 如何枚举包含为“的图像”;内容“;在XAP?

Silverlight 如何枚举包含为“的图像”;内容“;在XAP?,silverlight,windows-phone-7,resources,Silverlight,Windows Phone 7,Resources,我在为芒果部署的XAP中包含了许多图像作为“内容” 我想在运行时列举这些——有什么方法可以做到这一点吗 我尝试过列举资源,如: foreach (string key in Application.Current.Resources.Keys) { Debug.WriteLine("Resource:" + key); } 但是这些图像不包括在列表中。我也尝试过使用嵌入式资源,但是没有用。我可以使用Application.GetResourceStream(uri)读取流,但显然我需要

我在为芒果部署的XAP中包含了许多图像作为“内容”

我想在运行时列举这些——有什么方法可以做到这一点吗

我尝试过列举资源,如:

foreach (string key in Application.Current.Resources.Keys)
{
    Debug.WriteLine("Resource:" + key);
}

但是这些图像不包括在列表中。我也尝试过使用嵌入式资源,但是没有用。我可以使用
Application.GetResourceStream(uri)
读取流,但显然我需要知道名称才能做到这一点。

这不是WP7中嵌入的API,它允许您枚举Xap的内容。您需要知道内容项的名称,然后才能检索它们


可能有一些代码在某处浮动,可以嗅出XAP中的Zip目录,但是我强烈建议您不要麻烦。而是包括一些合理的资源,如Xml文件或列出它们的
ResourceDictionary

无法枚举设置为“内容”的文件

但是,如果将文件设置为“嵌入式资源”,则可以在运行时枚举文件

以下是如何做到这一点:

  • 将图像的构建操作设置为“嵌入式资源”
  • 使用
    Assembly.GetCallingAssembly().GetManifestResourceNames()
    枚举资源名称
  • 使用
    Assembly.GetCallingAssembly().GetManifestResourceStream(resName)
    获取文件流
  • 代码如下:

        public void Test()
        {
            foreach (String resName in GetResourcesNames())
            {
                Stream s = GetStreamFromEmbeddedResource(resName);
            }
        }
    
        string[] GetResourcesNames()
        {
            return Assembly.GetCallingAssembly().GetManifestResourceNames();
        }
    
        Stream GetStreamFromEmbeddedResource(string resName)
        {
            return Assembly.GetCallingAssembly().GetManifestResourceStream(resName);
        }
    

    编辑:正如Quetzalcatl所指出的,此解决方案的缺点是图像嵌入到DLL中,因此,如果您需要大量图像,应用程序加载时间可能会受到影响。

    由于找不到从XAP读取内容文件的实用方法,我在设计时使用T4构建了这样一个列表

    参见上的示例

    这似乎是正确的方式:
    a) 我宁愿在设计时创建一次列表,也不愿在每部需要代码的手机上创建一次。

    b) 我不应该在不确定包含哪些文件的情况下构建XAP


    另外,在所有此类文件上设置生成操作是一个手动步骤,因此为每个生成添加一个手动步骤“运行自定义工具”对我来说不是问题。

    您能否澄清执行此操作的目的?在这种特殊情况下,我想在内存中预先设置大约一百个图标。我不知道,但我怀疑这将有助于解决我所看到的性能问题。在前面的一个案例中(iron7的一个分支),我想在启动时加载一个满是ruby脚本的目录。在这两种情况下,我都可以用C#硬编码列表,但如果有办法的话,我宁愿避免这种情况——如果我可以列举添加到文件夹中的任何内容,那就太好了)我认为“预加载”列表不会带来任何显著的性能提升。将构建类型转换为内容应该足够快。至少我所有的应用程序都是这样。明白了——这是我正在尝试的几件事情之一。不管怎么说,我仍然有兴趣知道如何做到这一点——尽管它看起来并没有得到真正的支持。是的,但你忘了告诉OA你建议的事情有一个很大的负面影响:EmbeddedResource会导致文件嵌入到生成的DLL中。使用“内容”,它们将与DLL一起作为普通文件放置。因此,如果将大量文件转换为“EmbeddedResource”,则DLL将显著增长,启动时间将受到影响。使用“内容”的目的是使模块更小!虽然由于安全限制,无法枚举WP7上的“内容”,但可以在构建过程中生成一个列表,并在运行时读取该列表。没错,我编辑了答案以突出该缺陷。