我有一个基于 Xamarin 的 Visual Studio 2015 项目,该项目具有以下结构。
我的应用(便携式(MyApp.Droid我的应用.iOS
目前,我在 MyApp.Droid 项目和 MyApp.iOS 项目中包含了资产/资源。
因此,例如myhtml.html
被复制为 MyApp.Droid/Asserts/myhtml.html 和 MyApp.iOS/Resources/myhtml.html
有什么方法可以避免这种重复吗?
假设你使用的是 Xamarin Forms,是的,你可以使用 .net 资源文件。
您可以在可移植项目中创建一个文件夹,在其中添加内容文件,并将所有这些内容的编译操作设置为"嵌入资源",然后可以使用 .net 提供的机制来访问资源,每个示例(在此示例中,我假设代码在可移植项目中包含的类中执行,并且文件存储在名为 ResourceFiles 的文件夹中(:
var htmlFile = this.GetType().GetTypeInfo().Assembly.GetManifestResourceStream("MyNamespace.ResourceFiles.myhtml.html");
通过这种方式,您可以获得包含文件内容的流。
此外,作为提示,可以使用自定义标记扩展从 XAML 加载这些文件,下面是用于从 .net 资源加载图像的标记扩展:
[ContentProperty ("Source")]
public class ImageResourceExtension : IMarkupExtension
{
public string Source { get; set; }
public object ProvideValue (IServiceProvider serviceProvider)
{
if (Source == null)
return null;
var imageSource = new StreamImageSource { Stream = async (ct) => this.GetType().GetTypeInfo().Assembly.GetManifestResourceStream(Source) };
return imageSource;
}
}
然后,若要在 XAML 中使用此扩展,你将执行(本地是你自己的命名空间的 XAML 命名空间定义(:
<Image Source="{local:ImageResource MyNamespace.ResourceFiles.MyImage.png}" />