0

MVVM Caliburn ベースの WinRT 8.1 アプリを作成しようとしています (バージョン 2.0 がリリースされるまで、CM は 8.1 と完全に互換性がないことはわかっていますが、エラーは関連していないようです。ハンドラーはビュー コード ビハインドに配置されます)。そのビューの 1 つにWebViewコントロールが含まれており、そのコンテンツはNavigateToStringを介して設定されます (HTML コンテンツはアプリのインストール済みアセットから取得されます)。このコントロールにロードされた HTML にはいくつかのハイパーリンクが含まれており、それらのほとんどは他のアセットベースの HTML コンテンツへの相互参照を表しています。そのため、ユーザーがリンクをクリックしたときに、標準のナビゲーション アクションをオーバーライドし、ビューモデルに通知を受け取り、アプリ アセットから別の HTML コンテンツをロードできるようにします。

WebView (WinRT) の外部ブラウザーでリンクを開くという投稿に従って、私がしたことは次のとおりです。

  1. XAML コードで、ScriptNotify イベントを VM にアタッチするための属性を WebView コントロールに追加しましたcal:Message.Attach="[Event ScriptNotify] = [Action GetFromLink($eventArgs)]"( https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actionsを参照)。

  2. 私の VM では、メソッド シグネチャはpublic void GetFromLink(NotifyEventArgs e).

  3. 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に追加の手順は必要ありません。誰かが解決策を提案できますか?

4

2 に答える 2

0

このイベントを聞く場合: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.domcontentloaded.aspx WebView.DOMContentLoaded イベント, すべてのスクリプトはスクリプトが読み込まれない前にこれを行おうとしている場合は、アクセスして実行できるはずです。

于 2013-12-04T03:43:15.090 に答える