如何在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中的文件。

你知道解决这个问题的方法吗?即使是一个替代的工作方式也会让我感到惊讶。

如何在UWP c#的appdata中从html中接收scriptNotify

Ref Script通知XAML中的更改:

要使内容能够发送通知,需要满足以下条件:

  • 页面的来源应该来自本地系统通过NavigateToString()NavigateToStream()ms-appx-web:///

  • 页面的来源通过https://传递,网站域名在包清单的应用程序内容URI部分列出。
为了解决这个问题,我们可以使用WebView。使用协议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)示例