Block Win RT Uri Association

时间:2014-06-03 14:36:15

标签: c# webview winrt-xaml windows-phone-8.1

我遇到一个问题,我的WebView正试图导航到像“myapp:/// mobilesdk /”这样的网址。当它这样做时,操作系统尝试从商店启动应用程序,当我真的想要触发NavigationStarting事件,我可以取消导航并做我想要的。

我有办法阻止操作系统尝试启动应用程序吗?

只是添加我在WinRT中使用Windows Phone 8.1,而不是Silverlight。

2 个答案:

答案 0 :(得分:0)

Windows 8实现自定义协议的方式是,当您调用anything:时,它首先查找本地关联(包括桌面应用程序)。如果未找到,则会提示用户使用对话框搜索Windows应用商店。没有办法改变这种行为。

答案 1 :(得分:0)

Jerry对协议的实施方式是正确的。对于这种情况,我可以看到您如何不期望将URL暴露给系统启动器的行为。今天没有一个可以帮助您使用WebView的头等活动。

解决此问题的一种可能方法是使用invokeScriptAsync和ScriptNotify事件。

myWebView.DOMContentLoaded += myWebView_DOMContentLoaded;
myWebView.ScriptNotify += myWebView_ScriptNotify;

void myWebView_ScriptNotify(object sender, NotifyEventArgs e)
{
    //TODO: handle e.Value
}

async void myWebView_DOMContentLoaded(WebView sender, WebViewDOMContentLoadedEventArgs args)
{
    await mwv.InvokeScriptAsync("eval", new string[] { "document.body.addEventListener('click', function handleClick(e) {if (e.srcElement.tagName == 'A') {e.preventDefault();try {window.external.notify(e.srcElement.href);}catch(err){console.log('ERROR: window.external.notify does not exist');}}}, true)" });
    //throw new NotImplementedException();
}

此代码在加载DOM时将此函数注入WebView内容:

function handleClick(e) {
    if (e.srcElement.tagName == 'A') {
        e.preventDefault();
        try {
            window.external.notify(e.srcElement.href);
        }catch(err){
            console.log("ERROR: window.external.notify doesn't exist");
        }
    }
}

根据您的内容,这可能不是理想的方法,因为此函数会阻止所有A标记在父应用程序myWebView_ScriptNotify函数的代码之外导航。您必须拥有处理A标签导航的所有逻辑。这可能是您正在寻找的,但如果您有href =' http://www.somewhere.com'这也将通过这种机制。