解雇WinRT 8.1 WebView ScriptNotify时出现未处理的异常

时间:2013-10-27 15:56:19

标签: windows-runtime winrt-xaml caliburn.micro windows-8.1

我正在尝试创建一个基于MVVM Caliburn的WinRT 8.1应用程序(我知道在版本2.0出来之前CM不会与8.1完全兼容,但错误似乎没有关系,因为它被提升了当处理程序放在后面的视图代码中时也是如此)。其中一个视图包含 WebView 控件,其内容通过 NavigateToString 设置(HTML内容来自应用程序的已安装资产)。加载到此控件中的HTML包含多个超链接,其中大多数表示对其他基于资产的HTML内容的交叉引用。因此,当用户点击我想要覆盖标准导航操作的链接时,请通知我的viewmodel,并让它从应用资产中加载另一个HTML内容。

以下是我在帖子Open links in external browser in WebView (WinRT)之后所做的事情:

  1. 在XAML代码中,我向WebView控件添加了一个属性,用于将ScriptNotify事件附加到我的VM:cal:Message.Attach="[Event ScriptNotify] = [Action GetFromLink($eventArgs)]"(参见https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)。

  2. 在我的虚拟机中,方法签名为public void GetFromLink(NotifyEventArgs e)

  3. 每当我的VM将一些HTML加载到WebView中时,它首先在HTML头部中注入一个脚本,该脚本替换表示交叉引用的每个锚点的单击处理程序(所有这些锚点都由{{1}标记}属性)。此脚本在我的VM中保持常量:

  4. class="xref"

    现在,当我启动应用程序时,加载包含其中一个外部参照的项目并单击它,我得到未处理的异常告诉我“navCancelInit未定义”。我想这个错误是从JS代码出现的,但是我看不出应该在哪里以及如何定义这个函数。

    根据http://msdn.microsoft.com/library/windows/apps/br227713,当通过 NavigateToString 加载HTML时,我不需要为 ScriptNotify 添加任何其他步骤。有人可以提出解决方案吗?

2 个答案:

答案 0 :(得分:0)

我得到了一个MS人的回答,所以这个答案并不是我的答案:这是一个时间问题。在运行更改DOM的脚本之前,我必须确保页面已完全加载;如果你想的话,很简单。只需在页面末尾移动脚本,或将其包装在onload处理程序中,就应该成功。希望这可以为其他人节省一些毛发!

答案 1 :(得分:0)

如果您收听此事件:http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.domcontentloaded.aspx WebView.DOMContentLoaded事件,所有脚本都应该加载到WebView中,如果您在脚本之前尝试执行此操作,则应该能够访问和执行不会加载。