Xamarin Forms - 如何处理 iOS 包含的 PCL 部分
Xamarin Forms - How to deal against iOS includes of the PCL part
很难为我的问题找到一个标题,但很容易理解!
我有以下代码,它是一个控件 (gif)
public class Gif : WebView
{
public string GifSource
{
set
{
var html = new HtmlWebViewSource();
string GifAssetURL;
switch (Device.OS)
{
case TargetPlatform.Android:
GifAssetURL = "file:///android_asset/";
break;
case TargetPlatform.iOS:
//GifAssetURL = NSBundle.MainBundle.BundlePath;
GifAssetURL = "";
break;
case TargetPlatform.Windows:
GifAssetURL = "ms-appx-web:///Assets/";
break;
default:
GifAssetURL = "";
break;
}
html.Html = String.Format(@"<html><body style='background: #000000;'><img src='{0}' style='width:100%;height:100%;'/></body></html>", GifAssetURL + value);
SetValue(SourceProperty, html);
this.Margin = -10;
}
}
}
它适用于所有平台,但是,当需要生成 release
时,它会抛出有关包含 (Android & UWP)[=36 的错误=]:
using Foundation;
但是,我需要这个包含在 iOS 部分,因为我的 GIF 图片 位于 Project.iOS 的文件夹中 部分..
首先,我使用 NSBundle.MainBundle.BundlePath
但也许,它可能是一个简单的字符串?
其次,是否也可以从 ImageSource.FromResources("");
中获取有效的字符串路径?那样的话,我觉得问题就解决了..
感谢帮助!
然后,我终于找到了解决方案!
所以最后,使用 Fondation
link 会导致我的发布编译崩溃,而利用它的想法是拥有一个 BaseUrl
界面,让我解释一下!
首先,收回我的gif对象:
public class Gif : WebView
{
public string GifSource
{
set
{
var html = new HtmlWebViewSource();
// Take a look on this line !
string GifAssetURL = DependencyService.Get<IBaseUrl>().Get();
html.Html = String.Format(@"<html><body style='background: #000000;'><img src='{0}' style='width:100%;height:100%;'/></body></html>", GifAssetURL + value);
SetValue(SourceProperty, html);
this.Margin = -10;
}
}
}
根据当前使用的OS,然后给出好的路径。
因此,要使其正常工作,您必须在 PCL 部分创建一个接口,如下所示:
namespace Project
{
public interface IBaseUrl { string Get(); }
}
然后,对于您关注的每个平台,创建一个继承自 IBaseUrl
的 class。往下看:Android, iOS & UWP
Android
using Project;
using Project.Android.DependencyService;
using Xamarin.Forms;
[assembly: Dependency(typeof(BaseUrl_Android))]
namespace Project.Android.DependencyService
{
public class BaseUrl_Android : IBaseUrl
{
public string Get()
{
return "file:///android_asset/";
}
}
}
iOS
using Foundation;
using MapPinsProject.Interface;
using MapPinsProject.iOS.DependencyService;
using Xamarin.Forms;
[assembly: Dependency(typeof(BaseUrl_iOS))]
namespace MapPinsProject.iOS.DependencyService
{
public class BaseUrl_iOS : IBaseUrl
{
public string Get()
{
return NSBundle.MainBundle.BundlePath;
}
}
}
UWP
using Project;
using Project.UWP.DependencyService;
using Xamarin.Forms;
[assembly: Dependency(typeof(BaseUrl_UWP))]
namespace Project.UWP.DependencyService
{
public class BaseUrl_UWP : IBaseUrl
{
public string Get()
{
return "ms-appx-web:///";
}
}
}
希望对您有所帮助!玩得开心!
很难为我的问题找到一个标题,但很容易理解!
我有以下代码,它是一个控件 (gif)
public class Gif : WebView
{
public string GifSource
{
set
{
var html = new HtmlWebViewSource();
string GifAssetURL;
switch (Device.OS)
{
case TargetPlatform.Android:
GifAssetURL = "file:///android_asset/";
break;
case TargetPlatform.iOS:
//GifAssetURL = NSBundle.MainBundle.BundlePath;
GifAssetURL = "";
break;
case TargetPlatform.Windows:
GifAssetURL = "ms-appx-web:///Assets/";
break;
default:
GifAssetURL = "";
break;
}
html.Html = String.Format(@"<html><body style='background: #000000;'><img src='{0}' style='width:100%;height:100%;'/></body></html>", GifAssetURL + value);
SetValue(SourceProperty, html);
this.Margin = -10;
}
}
}
它适用于所有平台,但是,当需要生成 release
时,它会抛出有关包含 (Android & UWP)[=36 的错误=]:
using Foundation;
但是,我需要这个包含在 iOS 部分,因为我的 GIF 图片 位于 Project.iOS 的文件夹中 部分..
首先,我使用 NSBundle.MainBundle.BundlePath
但也许,它可能是一个简单的字符串?
其次,是否也可以从 ImageSource.FromResources("");
中获取有效的字符串路径?那样的话,我觉得问题就解决了..
感谢帮助!
然后,我终于找到了解决方案!
所以最后,使用 Fondation
link 会导致我的发布编译崩溃,而利用它的想法是拥有一个 BaseUrl
界面,让我解释一下!
首先,收回我的gif对象:
public class Gif : WebView
{
public string GifSource
{
set
{
var html = new HtmlWebViewSource();
// Take a look on this line !
string GifAssetURL = DependencyService.Get<IBaseUrl>().Get();
html.Html = String.Format(@"<html><body style='background: #000000;'><img src='{0}' style='width:100%;height:100%;'/></body></html>", GifAssetURL + value);
SetValue(SourceProperty, html);
this.Margin = -10;
}
}
}
根据当前使用的OS,然后给出好的路径。
因此,要使其正常工作,您必须在 PCL 部分创建一个接口,如下所示:
namespace Project
{
public interface IBaseUrl { string Get(); }
}
然后,对于您关注的每个平台,创建一个继承自 IBaseUrl
的 class。往下看:Android, iOS & UWP
Android
using Project;
using Project.Android.DependencyService;
using Xamarin.Forms;
[assembly: Dependency(typeof(BaseUrl_Android))]
namespace Project.Android.DependencyService
{
public class BaseUrl_Android : IBaseUrl
{
public string Get()
{
return "file:///android_asset/";
}
}
}
iOS
using Foundation;
using MapPinsProject.Interface;
using MapPinsProject.iOS.DependencyService;
using Xamarin.Forms;
[assembly: Dependency(typeof(BaseUrl_iOS))]
namespace MapPinsProject.iOS.DependencyService
{
public class BaseUrl_iOS : IBaseUrl
{
public string Get()
{
return NSBundle.MainBundle.BundlePath;
}
}
}
UWP
using Project;
using Project.UWP.DependencyService;
using Xamarin.Forms;
[assembly: Dependency(typeof(BaseUrl_UWP))]
namespace Project.UWP.DependencyService
{
public class BaseUrl_UWP : IBaseUrl
{
public string Get()
{
return "ms-appx-web:///";
}
}
}
希望对您有所帮助!玩得开心!