如何在UWP c#的appdata中从html中接收scriptNotify
本文关键字:html scriptNotify 中从 appdata UWP | 更新日期: 2023-09-27 18:03:18
如果从ms-appdata加载html, Windows将不会让我的WebView_ScriptNotify事件接收调用。
我知道我可以使用ms-appx-web协议从我的应用程序包中加载这样的文件,但这是没有选项,因为要显示的数据是在安装应用程序后下载的。我也不能只用webView。因为它不会在html文件中包含所引用的库。
目前我正在尝试在我的Class.xaml.cs
WebView webView = new WebView();
webView.ScriptNotify += WebView_ScriptNotify;
Uri navigationUri = new Uri(@"ms-appdata:///local/index.html");
webView.Navigate(navigationUri);
和
private void WebView_ScriptNotify(object sender, NotifyEventArgs e)
{
System.Diagnostics.Debug.WriteLine("ScriptNotifyValue: " + e.Value);
//I want to do the magic here, but this will never be called
}
HTML文件中的是
<div id="content">
<div class="btn" onClick="window.external.notify('hello world');"</div>
</div>
此外,不能使用InvokeScript(),因为我不知道什么时候必须触发事件,也不知道它的值。
但是必须使用ms-appdata中的文件。
你知道解决这个问题的方法吗?即使是一个替代的工作方式也会让我感到惊讶。
Ref Script通知XAML中的更改:
为了解决这个问题,我们可以使用WebView。使用协议要使内容能够发送通知,需要满足以下条件:
- 页面的来源应该来自本地系统通过NavigateToString(), NavigateToStream()或ms-appx-web:///
或
- 页面的来源通过https://传递,网站域名在包清单的应用程序内容URI部分列出。
ms-local-stream://
而不是ms-appdata://
的NavigateToLocalStreamUri方法。例如:public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
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 = webView.BuildLocalStreamUri("MyTag", "index.html");
StreamUriWinRTResolver myResolver = new StreamUriWinRTResolver();
// Pass the resolver object to the navigate call.
webView.NavigateToLocalStreamUri(url, myResolver);
}
private void webView_ScriptNotify(object sender, NotifyEventArgs e)
{
System.Diagnostics.Debug.WriteLine("ScriptNotifyValue: " + e.Value);
}
}
public sealed class StreamUriWinRTResolver : IUriToStreamResolver
{
public IAsyncOperation<IInputStream> UriToStreamAsync(Uri uri)
{
if (uri == null)
{
throw new Exception();
}
string path = uri.AbsolutePath;
// Because of the signature of the this method, it can't use await, so we
// call into a seperate helper method that can use the C# await pattern.
return GetContent(path).AsAsyncOperation();
}
private async Task<IInputStream> GetContent(string path)
{
// We use app's local folder as the source
try
{
Uri localUri = new Uri("ms-appdata:///local" + path);
StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(localUri);
IRandomAccessStream stream = await f.OpenAsync(FileAccessMode.Read);
return stream;
}
catch (Exception) { throw new Exception("Invalid path"); }
}
}
更多信息请参见WebView中的备注和示例。NavigateToLocalStreamUri方法和自定义URI解析在什么是新的WebView在Windows 8.1。此外,在GitHub上还有一个WebView控件(XAML)示例