Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enumerate images included as "Content" in the XAP?

I'm including a number of images as "Content" in my deployed XAP for Mango.

I'd like to enumerate these at runtime - is there any way to do this?

I've tried enumerating resources like:

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

But the images aren't included in the list. I've also tried using embedded resources instead - but that didn't help. I can read the streams using Application.GetResourceStream(uri) but obviously I need to know the names in order to do this.

like image 656
Stuart Avatar asked Sep 17 '11 17:09

Stuart


3 Answers

This is no API baked in to WP7 that allows you to enumerate the contents of the Xap. You need to know the name of the content items before you can retreive them.

There probably is some code floating around somewhere that is able to sniff out the Zip catalog in the XAP however I would strongly recommend that you don't bother. Instead include some sensible resource such as an Xml file or ResourceDictionary that lists them.

like image 166
AnthonyWJones Avatar answered Nov 18 '22 20:11

AnthonyWJones


Having found no practical way to read the Content files from a XAP I build such a list at design time using T4.

See an example at https://github.com/mrlacey/phonegap-wp7/blob/master/WP7Gap/WP7Gap/MainPage.xaml.cs

This seems the right way to go as:
a) I'd rather build the list once at design time rather than on every phone which needs the code.
and
b) I shouldn't ever be building the XAP without being certain about what files I'm including anyway.

Plus it's a manual step to set the build action on all such files so adding a manual step to "Run Custom Tool" once for each build isn't an issue for me.

like image 4
Matt Lacey Avatar answered Nov 18 '22 20:11

Matt Lacey


There is no way to enumerate the files set as "Content".

However, there is a way to enumerate files at runtime, if you set your files as "Embedded Resource".

Here is how you can do this:

  1. Set the Build Action of your images as "Embedded Resource".
  2. Use Assembly.GetCallingAssembly().GetManifestResourceNames() to enumerate the resources names
  3. Use Assembly.GetCallingAssembly().GetManifestResourceStream(resName) to get the file streams.

Here is the code:

    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);
    }

EDIT : As quetzalcoatl noted, the drawback of this solution is that images are embedded in the DLL, so if you a high volume of images, the app load time might take a hit.

like image 1
Olivier Payen Avatar answered Nov 18 '22 22:11

Olivier Payen