使用WebView Xamarin Forms加载本地HTML

时间:2017-07-14 10:00:26

标签: c# xamarin webview xamarin.forms

我正在尝试使用Xamarin表单在Webview中加载本地HTML页面。 我正在使用开发文档中的基本示例,虽然我可以获取加载的URL,但我无法加载自己的HTML页面。这只需要通过Android完成,所以不用担心IOS和Windows。

Xaml:

 <WebView
    x:Name="webviewjava"></WebView>

背后的代码:

 public partial class javscriptExample : ContentPage
{
    public interface IBaseUrl { string Get(); }
    public javscriptExample()
    {
        InitializeComponent();
        var source = new HtmlWebViewSource();

        source.BaseUrl = DependencyService.Get<IBaseUrl>().Get();

        webviewjava.Source = source;
    }
}

平台特定文件(LocalFile.cs): 请注意,这已被设置为Android资产。

 [assembly: Dependency(typeof(LocalFiles))]
namespace maptesting.Droid
{
    public class LocalFiles: IBaseUrl
    {
        public string Get()
        {
            return "file:///android_asset/";
        }

    }
}

并在资源的文件夹下有一个&#39; TestWebPage.html&#39;,也设置为Android资产。

虽然我不知道问题是什么,但我已经通过调试,基本网址又回来了。为了清楚我没有找到一个未找到的文件,屏幕只是空白。 此外,我不确定这是否有所作为。 &#39; IBaseUrl&#39;没有语法突出显示。在LocalFiles.cs文件中。所以我不确定它是否可以看到&#39;它

有什么想法吗?

5 个答案:

答案 0 :(得分:6)

我也遇到了同样的问题,但我以下列方式解决了

使用&#34; UrlWebViewSource&#34;而不是&#34; HtmlWebViewSource&#34;

var urlSource = new UrlWebViewSource();

string url = DependencyService.Get<IWebViewBaseUrl>().GetBaseUrl();


            string TempUrl = Path.Combine(url, "imprint.html");
            urlSource.Url = TempUrl;
 WebBrowser.Source = urlSource;

答案 1 :(得分:1)

WebView.BaseUrl只告诉WebView从哪里开始查找文件。它是&#34;网站&#34;的根文件夹。默认情况下,浏览器会加载文件index.html,因此如果您将文件重命名为index.html,我认为它应该自动加载。

我认为这也应该是可能的:

webviewjava.BaseUrl = DependencyService.Get<IBaseUrl>().Get();
webviewjava.Source = "TestWebPage.html";

在这里,你说&#34;使用此位置作为查找文件的默认位置&#34;和&#34;查找此文件并将其用作HTML&#34;。

的来源

答案 2 :(得分:1)

  

您必须检查Build Action = BundleResource的文件属性

尝试使用此代码加载本地html文件

var source = new HtmlWebViewSource();
        string url = DependencyService.Get<IBaseUrl>().GetBaseUrl();
        string TempUrl = Path.Combine(url, "terms.html");
        source.BaseUrl = url;
        string html;
        try
        {
            using (var sr = new StreamReader(TempUrl))
            {
                html = sr.ReadToEnd();
                source.Html = html;
            }
        }
        catch(Exception ex){
            Console.WriteLine(ex.Message);
        }
  

然后必须提供每个平台的界面实现

iOS

[assembly: Dependency(typeof(BaseUrl))]
namespace yournamespace
{
   public class BaseUrl: IBaseUrl
   {
      public string GetBaseUrl()
      {
        return NSBundle.MainBundle.BundlePath;
      }
   }
}

Android

[assembly: Dependency (typeof(BaseUrl))]
 namespace yournamespace {
   public class BaseUrl_Android : IBaseUrl {
      public string Get() {
        return "file:///android_asset/";
     } 
   }
 }

答案 3 :(得分:0)

我不确定这是否重要,但我找到了解决方法。我没有采取上述途径,而是采取了以下措施:

webviewjava.Source = "file:///android_asset/TestWebPage.html";

在后面的代码中,完全省略了IBaseUrl调用。 这就像它应该的那样。

答案 4 :(得分:0)

这是一篇过时的文章,但它可能会帮助希望仅使用一个HTML文件使用Android,iOS和UWP实现的人。使用这种方法,您只需要在所有平台上使用一个HTML文件即可。

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/files?tabs=vsmac#loading-files-embedded-as-resources