2017-06-14 3 views
0

からのWebViewをナビゲートします。いくつかのコードは、デバイスが正常に作成されたと仮定して、以下の例から抜けています。IoTBrowserは、タスク/スレッドのWebViewがあります

問題は、受信したメッセージの内容に応じてWebviewに特定のWebページに移動するように伝えたいということです。

問題は、です。 "Window.Current"はnullなので、クラッシュします。

protected override void OnLaunched(LaunchActivatedEventArgs e) 

次のコードは、アプリケーションが起動したときに所望のウェブサイトにナビゲートするために使用することができる:

Frame rootFrame = Window.Current.Content as Frame; 
if(rootFrame == null) rootFrame = new Frame(); 
rootFrame.Navigate(typeof(MainPage), "ms-appx-web:///help.html"); 

をしたがって、電流はでNULLでないオーバーライドコードで

public App() 
{ 
    Task.Run(ReceiveC2dAsync); 
} 

private async static Task ReceiveC2dAsync() 
{ 
    while (true) 
    { 
    Microsoft.Azure.Devices.Client.Message receivedMessage = await deviceClient.ReceiveAsync(); 
    if(receivedMessage != null) 
    { 
     // Snip 
     Task.Run(Navigate); 
    } 
    } 
} 

private async static Task Navigate() 
{ 
    try 
    { 
    if(Window.Current.Content != null) 
     ((Frame)Window.Current.Content).Navigate(typeof(MainPage), "http://www.google.com"); 
    } 
    catch(Exception e) 
    { 
    Debug.WriteLine("{0} Exception caught.", e); 
    } 
} 

この点。 私はrootframeを静的に保存し、タスクの後の時点でそれを使用すると、マーシャルエラーが発生します。つまり、オブジェクトは別のスレッドにマーシャリングされるように参照されています。

私のC#の知識は、です。進行中私は恐れる。 これまでのところ、Webビューを内部タスクに対応させる方法について適切な説明を見つけることができませんでした。出来ますか?そしてもしそうなら、どうですか?

PS:最初のサンプルコードは、対象商品:https://github.com/ms-iot/samples/tree/develop/IoTBrowser

答えて

1

問題、私はあなたのコードスニペットによると、特定のWebページ

に移動するのWebViewをお伝えしたいということですあなたはUWPアプリを開発しています。あなたはWebViewは、ウェブサイトに移動する方法を知りたい場合は、例えば、WebViewNavigate方法を使用することができるはずです。

webView.Navigate(new Uri("http://www.google.com")); 

次のコードは、ときに所望のウェブサイトに移動するために使用することができますアプリケーションの起動:

OnLaunched内のコードスニペットは、Frameで1ページに移動します。 FrameコントロールはウェブページではなくPageインスタンスへのナビゲーションをサポートしていますが、Frameでウェブサイトにナビゲートすることはできません。上記のコードスニペットでは、rootFrameMainPageに移動できますが、help.htmlには移動できません。しかし、ms-appx-web:///help.htmlパラメータをMainPageに設定し、WebViewMainPageに移動することができます。

マーシャルエラーが発生しました。基本的に、オブジェクトが別のスレッドにマーシャリングされるように参照されています。

あなたが別のスレッドでUIElementを起動したい場合は、Core​Dispatcherを使用することができるはず、直接呼び出すことはできません。

結論として、実際にやりたいことは、非UIスレッドのWebViewによってWebサイトに移動することだと思います。例:

+0

最後の1つは、目的の機能に近いものです。ただし、そうであってはいけません: "" System.ServiceModel.Dispatcher.RunAsync "" - その名前空間に "RunAsync" doestが存在しないことを示すエラーが発生します。どの用途にこれを含めるべきか、あるいはこの機能はUWPでは利用できないのですか? –

+1

@Thomas、いいえ、そのタイプは 'Windows.UI.Core.Core Dispatcher'です。完全な参照を追加するために自分のコードスニペットを更新してください。 –

+0

それは、それが動作しました。しかし、NavView機能では "webView"は使用できないため、OnLaunched中にWebViewへの参照を保存する必要がありました(フレームrootFrame = Window.Current.Content; Frame; mainWindow = rootFrame)。しかし、今のところ予想どおりにナビゲートしているので、あなたのソリューションがすぐに受け入れられるようにマークします。 –

関連する問題