我遇到一个问题,我的WebView正试图导航到像“myapp:/// mobilesdk /”这样的网址。当它这样做时,操作系统尝试从商店启动应用程序,当我真的想要触发NavigationStarting事件,我可以取消导航并做我想要的。
我有办法阻止操作系统尝试启动应用程序吗?
只是添加我在WinRT中使用Windows Phone 8.1,而不是Silverlight。
答案 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'这也将通过这种机制。