MVVM Caliburn ベースの WinRT 8.1 アプリを作成しようとしています (バージョン 2.0 がリリースされるまで、CM は 8.1 と完全に互換性がないことはわかっていますが、エラーは関連していないようです。ハンドラーはビュー コード ビハインドに配置されます)。そのビューの 1 つにWebViewコントロールが含まれており、そのコンテンツはNavigateToStringを介して設定されます (HTML コンテンツはアプリのインストール済みアセットから取得されます)。このコントロールにロードされた HTML にはいくつかのハイパーリンクが含まれており、それらのほとんどは他のアセットベースの HTML コンテンツへの相互参照を表しています。そのため、ユーザーがリンクをクリックしたときに、標準のナビゲーション アクションをオーバーライドし、ビューモデルに通知を受け取り、アプリ アセットから別の HTML コンテンツをロードできるようにします。
WebView (WinRT) の外部ブラウザーでリンクを開くという投稿に従って、私がしたことは次のとおりです。
XAML コードで、ScriptNotify イベントを VM にアタッチするための属性を WebView コントロールに追加しました
cal:Message.Attach="[Event ScriptNotify] = [Action GetFromLink($eventArgs)]"
( https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actionsを参照)。私の VM では、メソッド シグネチャは
public void GetFromLink(NotifyEventArgs e)
.VM が HTML を WebView にロードするときは常に、相互参照を表す各アンカーのクリック ハンドラーを置き換えるスクリプトを HTML ヘッドに挿入します (これらのアンカーはすべて
class="xref"
属性によってマークされます)。このスクリプトは、VM の定数に保持されます。
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;" +
"}}}";
ここで、アプリを起動し、これらの xref のいずれかを含むアイテムをロードしてクリックすると、 「 navCancelInit is undefined」という未処理の例外が発生します。このエラーは JS コードから発生していると思いますが、この関数をどこでどのように定義する必要があるかわかりません。
http://msdn.microsoft.com/library/windows/apps/br227713によると、 NavigateToStringを介して HTML が読み込まれている場合、 ScriptNotifyに追加の手順は必要ありません。誰かが解決策を提案できますか?