Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在xamarin forms webview中加载本地html文件_C#_Xamarin_Xamarin.forms - Fatal编程技术网

C# 如何在xamarin forms webview中加载本地html文件

C# 如何在xamarin forms webview中加载本地html文件,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我试图通过xamarin表单中的web视图加载一个html文件,该文件与我正在使用的类的路径相同。当我运行应用程序时,我会看到一个白色屏幕,没有加载任何内容。这是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; namespace App.Plan {

我试图通过xamarin表单中的web视图加载一个html文件,该文件与我正在使用的类的路径相同。当我运行应用程序时,我会看到一个白色屏幕,没有加载任何内容。这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace App.Plan
{
    public partial class Tornado : ContentPage
    {
        public Tornado()
        {
            InitializeComponent();
            var browser = new WebView
            {
                Source = "local.html"
};
    }
    }
}

Xamarin拥有与此相关的文件:

var browser=new WebView();
var htmlSource=新的HtmlWebViewSource();
htmlSource.Html=@”
Xamarin.表格
欢迎来到WebView

"; browser.Source=htmlSource;
这是github的官方示例


第二个选项卡可能会有所帮助。

我意识到这是一个很旧的选项卡,但是当涉及到本地文件时,文档可能并不完全清楚,所以我想与大家分享我的想法。希望这对任何在这里绊倒的人都有帮助

国家:

要使用WebView显示本地内容,需要像打开其他文件一样打开HTML文件,然后将内容作为字符串加载到HtmlWebViewSource的HTML属性中

需要注意的关键是WebView的Source属性仅适用于外部URL或HtmlWebViewSource。不能在源属性中放置本地URL。“您需要像打开任何其他文件一样打开HTML文件”这句话意味着(正如它不久之后所说的那样)您需要使用完整的文件路径而不是URL将文件的内容从磁盘加载到变量中

然后问题变成了“其他本地文件的链接如何?”这就是HtmlWebViewSource的BaseUrl属性发挥作用的地方。本文件通过说明以下内容来解决这一问题:

虽然已经加载了第一个页面,但是WebView不知道HTML来自何处。在处理引用本地资源的页面时,这是一个问题。可能发生这种情况的示例包括本地页面相互链接、页面使用单独的JavaScript文件或页面链接到CSS样式表

换句话说,Webview会自动在HTML中指向本地资源的任何链接前面添加BaseUrl

总结一下

在共享项目中创建IBaseUrl接口

公共接口IBaseUrl{
字符串Get();
}
在每个平台项目中创建特定于平台的IBaseUrl实现

iOS:

[程序集:依赖项(typeof(BaseUrl_iOS))]
命名空间使用webview.iOS工作
{
公共类BaseUrl_iOS:IBaseUrl
{
公共字符串Get()
{
返回NSBundle.MainBundle.BundlePath;
}
}
}
安卓

[程序集:依赖项(typeof(BaseUrl_Android))]
名称空间使用webview.Android
{
公共类BaseUrl_Android:IBaseUrl
{
公共字符串Get()
{
返回“file:///android_asset/";
}
}
}
超宽带

[程序集:依赖项(typeof(BaseUrl))]
命名空间使用webview.UWP工作
{
公共类BaseUrl:IBaseUrl
{
公共字符串Get()
{
返回“ms appx web://”;
}
}
}
确保HTML文件位于适当的文件夹中,并具有适当的生成操作

  • iOS:资源,生成操作:“BundleResource”
  • 安卓:资产,构建行动:“安卓资产”
  • UWP:项目根,构建操作:“内容”
确保WebView具有高度和宽度请求,否则可能无法渲染:

可能需要设置WebView的WidthRequest和HeightRequest属性以查看HTML内容,具体取决于WebView所属的布局。例如,这在StackLayout中是必需的

一旦设置完成,您就可以在共享项目中将其付诸实施。下面是一个简化的示例:

//使用DI函数获取平台的BaseUrl
var baseUrl=DependencyService.Get().Get();
//如果不需要,可以在此处附加子文件夹
//希望所有HTML文件与其他资源混合使用:
//var baseUrl=System.IO.Path.Combine(DependencyService.Get().Get(),“子文件夹”);
//使用基本url定义初始HTML页面的位置
var initialHtmlPath=System.IO.Path.Combine(baseUrl,“index.html”);
//创建viewsource,将第一个HTML文件作为字符串加载
var localHtmlViewSource=新的HtmlWebViewSource();
localHtmlViewSource.BaseUrl=BaseUrl;
localHtmlViewSource.Html=System.IO.File.ReadAllText(initialHtmlPath);
//将webview设置为使用本地源
HelpWebView.Source=localHtmlViewSource;

我建议您参考文档,将其放在iOS的资源文件夹/Android的资产文件夹中,并记住将构建操作设置为BundleResource for iOS和AndroidAsset for AndroidI。我已经完成了这项工作,但仍然收到相同的问题。还有其他建议吗?谢谢你的快速回复!:)要为web视图加载本地html文件,必须设置BaseUrl属性,以告知web视图使用哪个前缀解析文件。您需要在每个平台上执行此操作。那么,访问该路径和本地HTML文件的特定于平台的实现在哪里呢?如果你打电话给一个会被翻译成UrlWebViewSource的网站,那么你所发布的内容会起作用,local.html不会翻译,因此你什么也看不见。@Bearcat9425谢谢你的回复我理解你的意思,但我对c比较陌生,你能给我举个例子说明你建议我做什么吗?谢谢:)请阅读它为所有3个平台显示的内容
var browser = new WebView();
var htmlSource = new HtmlWebViewSource();
htmlSource.Html = @"<html><body>
  <h1>Xamarin.Forms</h1>
  <p>Welcome to WebView.</p>
  </body></html>";
browser.Source = htmlSource;
tabs.Children.Add (new LocalHtml {Title = "Local" });
tabs.Children.Add (new LocalHtmlBaseUrl {Title = "BaseUrl" });
tabs.Children.Add (new WebPage { Title = "Web Page"});
tabs.Children.Add (new WebAppPage {Title ="External"});