C# 从项目文件夹-Windows Phone 7动态加载图像

C# 从项目文件夹-Windows Phone 7动态加载图像,c#,silverlight,windows-phone-7,isolatedstorage,C#,Silverlight,Windows Phone 7,Isolatedstorage,我想做的事情似乎很简单,我在其他平台上也做过 这里是一些上下文:假设您有1000个小图像,希望在数据绑定列表框中显示。首先,将项目中的图像包括在文件夹“/images”中。您将其构建操作设置为“内容” 现在的问题是:如何在运行时将所有这些图像动态加载到应用程序中?我的意思是,不必知道1000个图像的每个名称 (如果您考虑的是IsolatedStorage,我已经尝试过了。图像文件夹是您项目的一部分,但不会自动加载到IsolatedStorage,因此据我所知,您无法从IsolatedStorag

我想做的事情似乎很简单,我在其他平台上也做过

这里是一些上下文:假设您有1000个小图像,希望在数据绑定列表框中显示。首先,将项目中的图像包括在文件夹“/images”中。您将其构建操作设置为“内容”

现在的问题是:如何在运行时将所有这些图像动态加载到应用程序中?我的意思是,不必知道1000个图像的每个名称


(如果您考虑的是IsolatedStorage,我已经尝试过了。图像文件夹是您项目的一部分,但不会自动加载到IsolatedStorage,因此据我所知,您无法从IsolatedStorage加载图像)

您可以在设计时使用以下T4模板获得此信息:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".gen.cs" #>
<#@ import namespace="System.IO"#>
// <auto-generated />
using Microsoft.Phone.Controls;

namespace MyAppNamespace
{
    public partial class MainPage : PhoneApplicationPage
    {
        private static string[] AllFilesInImagesFolder()
        {
            return new[] {
<#
            DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "images"));

            foreach(FileInfo file in directoryInfo.GetFiles("*.*", SearchOption.AllDirectories))
            {
                if (!file.FullName.Contains(@"\."))
                {#>
                           "<#= file.FullName.Substring(file.FullName.IndexOf("images")).Replace(@"\", "/") #>",
<#              }
            }
#>
                        };
        }
    }
}

// 
使用Microsoft.Phone.Controls;
名称空间MyAppNamespace
{
公共部分类主页:PhoneApplicationPage
{
私有静态字符串[]AllFilesInImagesFolder()
{
返回新的[]{
"",
};
}
}
}
它将生成如下内容:

// <auto-generated />
using Microsoft.Phone.Controls;

namespace MyAppNamespace
{
    public partial class MainPage : PhoneApplicationPage
    {
        private static string[] AllFilesInImagesFolder()
        {
            return new[] {
                           "images/image1.png",
                           "images/image2.png",
                           "images/image3.png",
                           "images/image4.png",
                           "images/image5.png",
                        };
        }
    }
}
//
使用Microsoft.Phone.Controls;
名称空间MyAppNamespace
{
公共部分类主页:PhoneApplicationPage
{
私有静态字符串[]AllFilesInImagesFolder()
{
返回新的[]{
“images/image1.png”,
“images/image2.png”,
“images/image3.png”,
“images/image4.png”,
“images/image5.png”,
};
}
}
}

显然,您可以根据需要更改部分类的名称空间和名称。

图像是有命名模式还是随机的?另外,如果您愿意,您可以将图像从XAP流式传输到您的独立存储中,但在这种情况下可能没有必要。我喜欢这个建议,但我不知道图像的名称。我想你可以说它们是随机的。没有与它们的命名方式相关的模式。我要找的是类似于-Directory.GetFiles(/images)。。。这将允许枚举给定目录中的所有文件;然后,您可以在运行时加载它们。。。但是,在WP7上Directory.GetFiles是被禁止的,我认为没有一种方法可以在不知道内容文件名的情况下迭代XAP文件。它也不能在运行时修改,因此您必须在编译时添加图像。有什么原因让你无法知道图像名称吗?尚未尝试此操作,但您可以将所有图像设置为
Resources
,并使用
ResourceManager
。但是,这样做会增加应用程序的加载时间。好的,我知道他们的名字。。。但是我真的想把1000个文件名硬编码到我的应用程序中吗?我不是建议你手动输入名称。相反,您可以创建一个控制台应用程序(非WP7项目),它在目录中迭代并创建一个包含文件名列表的文本文件。只要把这个文本文件放到你的XAP中,并在运行时读取这个文本文件,无论何时你需要得到你的图像名。。。今天晚些时候有机会我会试试这个。在了解了一下T4模板之后,这完全奏效了。谢谢你,伙计。棒 极 了就像马特一样,我从来没有听说过T4模板,但这正是我所需要的。谢谢你简洁的描述,谢谢你给我介绍了一个全新的功能。像我这样的代码复制粘贴者可能希望注意,代码中有两个要更改的路径名实例。:)