为什么我不能在WebView(UWP)的外部浏览器中打开链接?

时间:2018-02-25 08:57:53

标签: c# webview hyperlink uwp windows-10-universal

我正在开发一个即将完成的Web应用程序,该应用程序有一个本地WebApp,它有一些链接,我想在外部浏览器(Edge,Chrome等)中打开它们。

我的代码分为3部分:

1)Windows运行时组件:

using System;
using System.Collections.Generic;
using Windows.Foundation.Metadata;
using Windows.Storage;
using Windows.System;

namespace CallJSInterface
{
    [AllowForWeb]
    public sealed class CallJSCSharp
    {
        public async void OpenURL(string url)
        {
            await Launcher.LaunchUriAsync(new Uri(url));
        }
    }
}

2)WebView代码:

XAML:

<WebView x:Name="webView1" Source="ms-appx-web:///Assets/index.html" NavigationStarting="webView1_NavigationStarting" />

C#:

private void webView1_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
    sender.AddWebAllowedObject("CallJSCSharp", pObject: new CallJSCSharp());
}

3)JavaScript(jQuery):

$("a").click(function (event) {
    event.preventDefault();
    CallJSCSharp.OpenURL($(this).attr('href'));
});

但没有任何反应,没有错误,没有消息,没有。有谁知道我应该改变什么?谢谢你的帮助。

其他信息: Windows Versions

我对两个项目使用相同的配置。

1 个答案:

答案 0 :(得分:4)

有两个问题导致代码无效。

首先 - Windows运行时组件自动修改命名约定以匹配执行它的目标平台。因为约定的JavaScript方法名称以小写字母开头,所以必须像这样调用OpenURL方法:

CallJSCSharp.openURL($(this).attr('href'));

现在,您应该能够在Windows运行时组件中设置断点,并查看实际调用的方法。但还有另一个问题 - OpenURL方法未在UI Launcher正常工作所需的UI线程上调用。为了避免这种情况,您需要使用Dispatcher

[AllowForWeb]
public sealed class CallJSCSharp
{
    public async void OpenURL(string url)
    {
        await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
            async () => { 
                 await Launcher.LaunchUriAsync(new Uri(url)); 
            });
    }
}

通过此更改,代码应按预期工作。

最后 - 谢谢你写一个完美的问题:-)。