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

时间:2017-06-08 18:10:36

标签: c# visual-studio xamarin xamarin.ios xamarin.android

我有一个基于Xamarin的Visual Studio 2015项目,它具有以下结构。

MyApp(便携式) MyApp.Droid MyApp.iOS

目前,我在MyApp.Droid项目中包含资源/资源 MyApp.iOS项目。

例如,myhtml.html 重复,因为MyApp.Droid / Asserts / myhtml.html和MyApp.iOS / Resources / myhtml.html

有什么方法可以避免这种重复吗?

1 个答案:

答案 0 :(得分:2)

假设您使用的是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中使用此扩展,您将执行此操作(local是您自己的命名空间的XAML命名空间定义):

<Image Source="{local:ImageResource MyNamespace.ResourceFiles.MyImage.png}" />