我正在尝试创建一个基于 MVVM Caliburn 的 WinRT 8.1 应用程序(我知道 CM 在 2.0 版发布之前不会与 8.1 完美兼容,但错误似乎并不相关,因为它也会在处理程序放在视图代码后面)。它的一个视图包含一个WebView控件,其内容是通过NavigateToString设置的(HTML 内容来自应用程序安装的资产)。加载到此控件中的 HTML 包括几个超链接,其中大多数表示对其他基于资产的 HTML 内容的交叉引用。因此,当用户单击我想要覆盖标准导航操作的链接时,通知我的视图模型,并让它从应用程序资产中加载另一个 HTML 内容。
这是我在 WebView (WinRT) 中在外部浏览器中打开链接后所做的:
在 XAML 代码中,我向 WebView 控件添加了一个用于将 ScriptNotify 事件附加到我的 VM 的属性:(
cal:Message.Attach="[Event ScriptNotify] = [Action GetFromLink($eventArgs)]"
请参阅https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)。在我的虚拟机中,方法签名是
public void GetFromLink(NotifyEventArgs e)
.每当我的 VM 将一些 HTML 加载到 WebView 中时,它首先会在 HTML 头中注入一个脚本,该脚本替换代表交叉引用的每个锚点的单击处理程序(所有这些锚点都由一个
class="xref"
属性标记)。该脚本在我的虚拟机中保持不变:
private const string SCRIPT = "for (var i = 0; i < document.links.length; i++) {" +
"var className = document.links[i].getAttribute(\"class\");" +
"if (className && className === \"xfer\") {" +
"document.links[i].onclick = function() {" +
"window.external.notify('url:' + this.href);" +
"return false;" +
"}}}";
现在,当我启动应用程序时,加载一个包含这些外部参照之一的项目并单击它,我得到一个未处理的异常,告诉我"navCancelInit is undefined"。我想这个错误是从 JS 代码中浮现出来的,但是我看不到应该在哪里以及如何定义这个函数。
根据http://msdn.microsoft.com/library/windows/apps/br227713 ,当通过NavigateToString加载 HTML 时,我不需要任何额外的ScriptNotify步骤。有人可以提出解决方案吗?