我有一个基于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
有什么方法可以避免这种重复吗?
答案 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}" />