我正在尝试在UWP应用中显示相对于本地文件夹的网页。这意味着,我将页面本身作为字符串,但资产(图像,脚本)位于apps本地文件夹中。
我尝试使用我理解的NavigateToString
方法应该结合Source
控件的WebView
- 属性来完成此任务。
var baseUri = new Uri("ms-appdata:///local/");
WebView.Source = baseUri;
var page = ...;
WebView.NavigateToString(page);
但是,在分配Web视图的Source
- 属性时,这会给我以下错误消息:
Exception thrown: 'System.ArgumentException' in App.exe
Additional information: Value does not fall within the expected range.
显然,不支持使用资产的本地app文件夹?
该应用程序的目标是最低Windows 10 Build 10586.
有人知道这是否有一个有用的解决方法?
修改:我试图做一个最小的例子。在下文中,我创建了一个小型测试应用程序,除了从本地存储加载静态html文件之外什么都不做。据我所知,这段代码与XamlWebView example完全相似,但确实引发了ArgumentException。
MainPage.xaml中
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<WebView Name="WebView" />
</Grid>
</Page>
MainPage.xaml.cs中
using System;
using System.IO;
using Windows.Storage;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace App1
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
Initialize();
}
private async void Initialize()
{
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("index.html", CreationCollisionOption.ReplaceExisting);
using (var sw = new StreamWriter(await file.OpenStreamForWriteAsync()))
{
sw.WriteLine("<html>");
sw.WriteLine("<body>");
sw.WriteLine("This is some text");
sw.WriteLine("</body>");
sw.WriteLine("</html>");
}
WebView.Navigate(new Uri("ms-appdata:///local/index.html"));
}
}
}
我甚至不知道样本的区别在哪里,找不到任何。
答案 0 :(得分:2)
WebView.Source property用于获取或设置要在WebView控件中显示的HTML内容的统一资源标识符(URI)源。
我们通常在XAML中设置Source
属性。 XAML解析器自动将字符串转换为Uri。 Source
属性可以在代码中设置,但我们通常使用导航方法之一,例如Navigate,NavigateToString和{{ 3}}在代码中加载内容的方法。
您在代码中使用的URI不是WebView控件的有效URI,因此出现Value does not fall within the expected range.
错误。要从应用的本地存储中加载内容,我们需要将内容放在本地文件夹下的子文件夹中。 NavigateWithHttpRequestMessage中的参考备注:
要从应用的WebView class或LocalFolder数据存储中加载未压缩和未加密的内容,请使用TemporaryFolder方法和使用Navigate的Uri。此方案的 WebView 支持要求您将内容放在本地或临时文件夹下的子文件夹中。这样可以导航到URI,例如ms-appdata:/// local / folder / file.html 和ms-appdata:/// temp / folder / file.html 。 (要加载压缩或加密的文件,请参阅ms-appdata scheme。)
这些第一级子文件夹中的每一个都与其他第一级子文件夹中的内容隔离。例如,您可以导航到ms-appdata:///temp/folder1/file.html,但是此文件中没有链接到ms-appdata:///temp/folder2/file.html。但是,您仍然可以使用 ms-appx-web 方案链接到应用包中的HTML内容,还可以使用 http 和 https 来链接到网络内容strong> URI方案。
因此,当您使用WebView.Navigate(new Uri("ms-appdata:///local/index.html"));
时,仍然会收到错误,因为ms-appdata:///local/index.html
也不是WebView的有效URI。
此外,虽然NavigateToLocalStreamUri支持内容引用外部文件,如CSS,脚本,图像和字体。但它仅使用 ms-appx-web 方案支持应用包中的内容,并使用 http 和 https URI方案支持网络内容。它无法与位于apps本地文件夹中的资产一起使用。要实现您想要的功能,您需要将这些资源放入本地文件夹下的子文件夹中,然后将html字符串存储到同一子文件夹下的文件中。在html中,您可以使用相对URI来引用这些资产,例如NavigateToString中的资产。