WebView 控件出现在 Windows 8.1 之后,并且从 C#/VB/C++ 开始,它已被记录下来,并且可以通过 NavigateToLocalStreamUri 调用轻松使用。然而在 WinJS 中,尽管 Internet Explorer 的 MSDN 部分也有半文档,但没有示例。
问题是我们必须将 IUriToStreamResolver 对象传递给此调用(Windows.Web 甚至在 WinJS 中不包含它)。然而,据我所知,在 WinJS 中,不可能从 WinRT 类派生或实现这些接口(interface)。 WinJS 只是将 IUriToStreamResolver 视为“对象”,并且以下代码失败并显示“不支持此类接口(interface)”:
var streamResolver = WinJS.Class.define(null, {}, {
uriToStreamAsync: function (uri) {
return Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(function (file) {
return file.openAsync(Windows.Storage.FileAccessMode.read);
});
}});
var webViewControl = window.document.createElement("x-ms-webview");
webViewControl.width = width;
webViewControl.height = height;
webViewControl.navigateToLocalStreamUri(webViewControl.buildLocalStreamUri("default", "/default.html"), new streamResolver());
webViewControl.innerHTML = document.documentElement.innerHTML;
window.document.body.appendChild(webViewControl);
我目前的结论是,在 Microsoft 实现提供 javascript 事件的包装器对象之前,我们必须使用 WinRT 库,使用我们自己的对象导入 WinMD,以便我们可以用 C#/VB/C++ 包装此代码。该类可以称为 UriToStreamResolverWrapper,它有一个 OnUriToStreamAsync 事件,可以通过 addEventListener/removeEventListener 使用。我可以稍后用 C++ 发布此代码,但似乎 Microsoft 错过了这个代码,并且确实应该支持它......
最佳答案
根据 Microsoft 博客,这是不可能的:“在 JavaScript 应用程序中,不可能用 JavaScript 编写 UriResolver 对象。但是,您可以使用用 C++、C# 或 VB 编写的解析器。了解更多详情请参见WebView SDK示例中的场景4。”在https://blogs.windows.com/buildingapps/2013/07/17/whats-new-in-webview-in-windows-8-1/
这已在此处的工作和测试模型上成功实现:http://www.codeproject.com/Tips/1080256/Using-the-WebView-controls-navigateToLocalStreamUr
我认为,在 Microsoft 提供包装器之前,如果没有 VB.NET/C#/C++/CX 或 native C++ 中的单独库中的对象,就没有任何方法可以做到这一点。
关于javascript - 如何从WinJS/javascript使用WebView控件navigateToLocalStreamUri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546022/