是否真的没有办法在UWP WebView中实现confirm()和prompt()?

时间:2018-02-20 22:19:35

标签: uwp

有没有人获得最基本的Javascript API,如prompt()和confirm()在UWP WebView中工作?它们没有实现并不奇怪,但是真的没有办法在应用程序中支持它们吗?如果是真的,那真是太疯狂......

在你提问之前,我们已经有太多的HTML / Javascript来重写它只是为了一个新的Windows应用程序。无论如何,认为我们应该这样做是愚蠢的。

最大的问题是,当我们等待用户阅读对话框时,无法暂停Javascript线程。以下是我尝试过的一些事情:

  • ScriptNotify:这适用于alert(),但我们无法返回结果,例如confirm()。
  • AddWebAllowedObject:我尝试实现一个本机对象,它更接近。 Javascript调用了我的本机警报功能并等待,但在本机函数返回结果之前,我无法显示一个对话框。用户界面刚刚挂起。 :(
  • WebViewExecutionMode.SeparateThread:我终于尝试在另一个线程上运行WebView。有了这个,对话框实际上出现了,但随后一切都冻结,直到本机函数再次返回结果。多线程的噩梦...

如果真的不可能,微软是否计划很快添加它? Android,macOS和iOS Web视图都支持这些基本API;一块蛋糕。

2 个答案:

答案 0 :(得分:0)

  

真的没有办法在UWP WebView中实现confirm()和prompt()吗?

如果您需要接收从WebView托管的脚本发送的应用代码中的通知和数据,则需要处理ScriptNotify事件。

  

ScriptNotify:这适用于alert(),但我们无法返回结果,例如confirm()。

如您所知,confirm()方法可能效果不佳。但您可以在UWP应用中使用MessageDialog作为解决方法来获得相同的效果。例如:

HTML

<button id="btnConfirm" onclick="confirmBox('sure to delete?')">click me to confirm</button> 
<script type="text/javascript">
    function confirmBox(message) { 
        window.external.notify('typeConfirm:' + message); 
    }
</script>

C#代码背后

private async void WebView_ScriptNotify(object sender, NotifyEventArgs e)
{
    Windows.UI.Popups.MessageDialog dialog;
    string[] messageArray = e.Value.Split(':');
    string message;
    string type;
    if (messageArray.Length > 1)
    {
        message = messageArray[1];
        type = messageArray[0];
    }
    else
    {
        message = e.Value;
        type = "typeAlert";
    }
    dialog = new Windows.UI.Popups.MessageDialog(message);
    Debug.WriteLine("type=" + type + " ,message=" + message);

    if (type.Equals("typeConfirm"))
    {
        dialog.Commands.Add(new UICommand("Yes"));
        dialog.Commands.Add(new UICommand("Cancel"));
        dialog.DefaultCommandIndex = 0;
        dialog.CancelCommandIndex = 1;
    }
    var result = await dialog.ShowAsync();
    if (result.Label.Equals("Yes"))
    {
        // do something you want, maybe invoke a script
        //await webView1.InvokeScriptAsync("eval", new string[] { functionString });
    }
    else
    {
        // do something you want, maybe invoke a script
        //await webView1.InvokeScriptAsync("eval", new string[] { functionString });
    }
}
  

在你提问之前,我们已经有太多的HTML / Javascript来重写它只是为了一个新的Windows应用程序

如果你担心这个使用上面的解决方法,我担心没有别的办法。

  

如果真的不可能,微软是否计划很快添加它?

很抱歉,我们无法确定将来是否可以实施某项功能,但您可以尝试将自己的功能发布到user voice。无论如何,似乎不建议使用confirm()中托管的WebView。如果有条件,您可以考虑将HTML / JavaScript转换为UWP应用程序的其他方法。有关详细信息,请查看此similar thread

答案 1 :(得分:0)

Javascript / Typescript 的解决方案。 将适用于 UWP 应用,而不适用于 Edge/IE。

     async function confirm(title: string, message: string | null): Promise<boolean> {

        const UI = window['Windows'].UI;

        const dialog = new UI.Popups.MessageDialog(message, title);

        const yes = new UI.Popups.UICommand("Yes");
        yes.id = 0;
        const no = new UI.Popups.UICommand("No");
        yes.id = 1;
        dialog.commands.push(yes);
        dialog.commands.push(no);
        dialog.defaultCommandIndex = 0;
        dialog.cancelCommandIndex = 1;
        const result = await dialog.showAsync();
        return result.id === yes.id;
    }