Xamarin Forms - 如何处理iOS包括PCL部分

时间:2016-09-22 16:31:00

标签: path platform

很难为我的问题找到标题但很容易理解!

我有以下代码,它是一个控件(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&amp; UWP)的错误:< / p>

using Foundation;

但是,对于iOS部分我需要这个,因为我的 GIF图像位于 Project.iOS 部分的文件夹中。

首先,我使用NSBundle.MainBundle.BundlePath但也许,它可能是一个简单的字符串?

其次,是否可以从ImageSource.FromResources("");中获取有效的字符串路径?在这种情况下,我认为它可以解决问题..

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

然后,我终于找到了解决方案!

最后,使用Fondation链接崩溃了我的发布编译以及获取它的想法,就是拥有一个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;
        }
    }
}

根据当前使用的操作系统,将给出良好的路径。

因此,为了使其有效,您必须在PCL部件中创建一个类似于:

的接口
namespace Project
{
    public interface IBaseUrl { string Get(); }
}

然后,对于您正在关注的每个平台,创建一个继承自IBaseUrl的类。请看下面的内容: Android,iOS&amp; 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:///";
        }
    }
}

希望它有所帮助!玩得开心!