我制作了一个Wpf项目,该项目演示了如何使用WebView在App内导航html文件,但是失败了。
主要的CS文件代码如下:
public MainWindow()
{
this.InitializeComponent();
this.wv.ScriptNotify += Wv_ScriptNotify;
this.Loaded += MainPage_Loaded;
}
private async void Wv_ScriptNotify(object sender, Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT.WebViewControlScriptNotifyEventArgs e)
{
//await (new MessageDialog(e.Value)).ShowAsync();
textBlock.Text = e.Value;
//返回结果给html页面
await this.wv.InvokeScriptAsync("recieve", new[] { "hehe, 我是个结果" });
}
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
//我们事先写好了一个本地html页面用来做测试
this.wv.Source = new Uri("ms-appx-web://Assets/index.html");
//this.wv.Source = new Uri("http://www.baidu.com");
}
html文件index.html位于项目内部,位于Assets/index.html
。它的源代码在这里:https : //github.com/tomxue/WebViewIssueInWpf/raw/master/WpfApp3/Assets/index.html
我将项目代码放在GitHub上:https : //github.com/tomxue/WebViewIssueInWpf.git
如果项目运行良好,则当WebView访问内部html文件时,应首先显示一个按钮。但是我什么也没看见。
更多:
根据已接受的答案(感谢Pavel Anikhouski),我如下更改了代码,现在可以正常工作了。
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
//我们事先写好了一个本地html页面用来做测试
//this.wv.Source = new Uri("ms-appx-web://Assets/index.html");
//this.wv.Source = new Uri("http://www.baidu.com");
var html = File.ReadAllText("../../Assets\\index.html");
wv.NavigateToString(html);
}
这似乎是一个已知的问题与WebView
控制WindowsCommunityToolkit
- 您只能
WebView
对接受字符串路径的控件成员中的资源使用绝对URI 。WebView
控件无法识别ms-appx:///
前缀,因此它们无法从程序包中读取(如果您已为应用程序创建了程序包)。WebView
控件无法识别File://
前缀。如果要将文件读入WebView
控件,请向应用程序中添加代码以读取文件的内容。然后,将该内容序列化为字符串,然后调用控件的NavigateToString(String)
方法WebView
。
因此,与其加载文件,this.wv.Source = new Uri("ms-appx-web://Assets/index.html");
不如尝试读取本地文件,然后导航至字符串
var html = File.ReadAllText("Assets\\index.html");
this.wv.NavigateToString(html);
它应该可以正常工作(我已经看到了按钮和消息的结尾)。另外,不要忘记复制Assets\index.html
到输出目录(设置“始终复制”或“如果较新则复制”)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句