C# 使用WebView Xamarin表单加载本地HTML

C# 使用WebView Xamarin表单加载本地HTML,c#,xamarin,webview,xamarin.forms,C#,Xamarin,Webview,Xamarin.forms,我正在尝试在带有Xamarin表单的webview中加载本地HTML页面。 我使用的是dev文档中的基本示例,尽管我可以获得一个要加载的URL,但我无法获得自己的HTML页面来加载。这只需要通过安卓系统完成,这样就不用担心IOS和Windows了 Xaml: <WebView x:Name="webviewjava"></WebView> 在资产文件夹下有一个“TestWebPage.html”,也被设置为Android资产 [assembly: Depen

我正在尝试在带有Xamarin表单的webview中加载本地HTML页面。 我使用的是dev文档中的基本示例,尽管我可以获得一个要加载的URL,但我无法获得自己的HTML页面来加载。这只需要通过安卓系统完成,这样就不用担心IOS和Windows了

Xaml:

 <WebView
    x:Name="webviewjava"></WebView>
在资产文件夹下有一个“TestWebPage.html”,也被设置为Android资产

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

    }
}
虽然我不知道问题出在哪里,但我已经把它调试好了,并且基本url返回为空白。只是为了清楚我没有得到一个文件没有找到,屏幕只是空白。 还有,我不确定这是否有什么不同。LocalFiles.cs文件中的“IBaseUrl”上没有语法突出显示。所以我不确定它是否能“看到”它


有什么想法吗?

我不确定这是否算数,但我找到了解决办法。我没有走上述路线,而是简单地这样做:

webviewjava.Source = "file:///android_asset/TestWebPage.html";
在后面的代码中,完全忽略了IBaseUrl调用。
这与预期的一样有效。

WebView.BaseUrl
仅告诉
WebView
从何处开始查找文件。它是“网站”的根文件夹。默认情况下,浏览器将加载文件
index.html
,因此如果您将文件重命名为
index.html
,我认为应该自动加载

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

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

这里你说的是“使用此位置作为查找文件的默认位置”和“查找此文件并将其用作HTML的源”。

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

使用“UrlWebViewSource”而不是“HtmlWebViewSource”

var urlSource=new UrlWebViewSource();
字符串baseUrl=DependencyService.Get().GetBaseUrl();
字符串filePathUrl=Path.Combine(baseUrl,“imprint.html”);
Url=filePathUrl;
WebBrowser.Source=urlSource;

这是一篇老文章,但它可能会帮助那些希望通过一个HTML文件实现Android、iOS和UWP的人。使用这种方法,所有平台只使用一个HTML文件

必须检查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);
        }
Android

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

这不算数,因为它只能在Android上运行。您应该真正创建依赖项服务,并在每个实现中返回适当的字符串。对于android来说,它是“file:///android_asset/TestWebPage.html“,对于IOS来说,这将是另外一种只需要在安卓系统中工作的东西,我在问题中确实说过。谢谢,我会看看这个,这可能应该被标记为答案。”。这在IOS和Android上都适用。@SanchalKunnel html/css/javascript文件是否需要添加到两个项目中?还是添加到普通项目中会有用?@chandravadan我相信你必须将其添加到android和iOS项目中。我忘了,想想添加到iOS和android中为什么我会得到“IWebViewBaseUrl找不到”?
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);
        }
[assembly: Dependency(typeof(BaseUrl))]
namespace yournamespace
{
   public class BaseUrl: IBaseUrl
   {
      public string GetBaseUrl()
      {
        return NSBundle.MainBundle.BundlePath;
      }
   }
}
[assembly: Dependency (typeof(BaseUrl))]
 namespace yournamespace {
   public class BaseUrl_Android : IBaseUrl {
      public string Get() {
        return "file:///android_asset/";
     } 
   }
 }