可以在 iOS + Droid 项目之间共享资产/资源吗?



我有一个基于 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}" />

最新更新