我想从 html 文件中的按钮通知我的 web 视图并触发 javascript:
function notify(str) {
window.external.notify(str);
}
使用捕获的事件wv_ScriptNotify(..., ...)
:
void wv_ScriptNotify(object sender, NotifyEventArgs e)
{
Color c=Colors.Red;
if (e.CallingUri.Scheme =="ms-appx-web" || e.CallingUri.Scheme == "ms-appdata")
{
if (e.Value.ToLower() == "blue") c = Colors.Blue;
else if (e.Value.ToLower() == "green") c = Colors.Green;
}
appendLog(string.Format("Response from script at '{0}': '{1}'", e.CallingUri, e.Value), c);
}
我设置了 html 文件ms-appx-web
,它运行良好,我意识到 html 文件必须存储到本地文件夹中。所以我将其更改ms-appx-web:///.../index.html
为ms-appdata:///local/.../index.html
.
已经在微软论坛搜索并得到这个。在那个线程上有一个使用解析器的解决方案,但我仍然很困惑,它怎么能像 using 一样从 javascript 通知window.external.notify
?除了“ScriptNotify”之外,C# 端的哪种事件会从 javascript 中捕获“通知”?
更新
这里有一个解决方案,例如使用解析器,它说使用ms-local-stream://
而不是使用ms-appdata://local
,所以我仍然可以使用该ScriptNotify
事件。但不幸的是,使用ms-appx
that 的示例意味着使用InstalledLocation
not LocalFolder
。
尝试在msdn站点中搜索和搜索文档,ms-local-stream
但唯一的文档只是格式,ms-local-stream
没有任何这样的示例ms-local-stream://appname_KEY/folder/file
。
根据该文档,我制作了一些示例进行尝试:
public sealed class StreamUriWinRTResolver : IUriToStreamResolver
{
/// <summary>
/// The entry point for resolving a Uri to a stream.
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
public IAsyncOperation<IInputStream> UriToStreamAsync(Uri uri)
{
if (uri == null)
{
throw new Exception();
}
string path = uri.AbsolutePath;
// Because of the signature of this method, it can't use await, so we
// call into a separate helper method that can use the C# await pattern.
return getContent(path).AsAsyncOperation();
}
/// <summary>
/// Helper that maps the path to package content and resolves the Uri
/// Uses the C# await pattern to coordinate async operations
/// </summary>
private async Task<IInputStream> getContent(string path)
{
// We use a package folder as the source, but the same principle should apply
// when supplying content from other locations
try
{
// My package name is "WebViewResolver"
// The KEY is "MyTag"
string scheme = "ms-local-stream:///WebViewResolver_MyTag/local/MyFolderOnLocal" + path; // Invalid path
// string scheme = "ms-local-stream:///WebViewResolver_MyTag/MyFolderOnLocal" + path; // Invalid path
Uri localUri = new Uri(scheme);
StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(localUri);
IRandomAccessStream stream = await f.OpenAsync(FileAccessMode.Read);
return stream.GetInputStreamAt(0);
}
catch (Exception) { throw new Exception("Invalid path"); }
}
}
在我的 MainPage.xaml.cs 中:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// The 'Host' part of the URI for the ms-local-stream protocol needs to be a combination of the package name
// and an application-defined key, which identifies the specific resolver, in this case 'MyTag'.
Uri url = wv.BuildLocalStreamUri("MyTag", "index.html");
StreamUriWinRTResolver myResolver = new StreamUriWinRTResolver();
// Pass the resolver object to the navigate call.
wv.NavigateToLocalStreamUri(url, myResolver);
}
当它到达StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(localUri);
线路时,它总是会得到异常。
如果有人遇到过这个问题并且已经解决了,请指教。