2017-06-14 64 views
0

有一个网页视图浏览网页视图:IoTBrowser,从任务/线程

<WebView x:Name="webView" Margin="0,10" Grid.RowSpan="3" LoadCompleted="webView_LoadCompleted"/> 

而且还有一个代码片断基础,开始将听取一个蓝色设备的任务。下面的例子中缺少一些代码,假定设备正常创建。

问题是,我想告诉Webview根据收到的消息的内容导航到某个网页。

问题是,。 “Window.Current”为空,所以它崩溃。

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); 
    } 
} 

在重写代码:

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"); 

因此,当前不为空,在这点。 如果我将rootframe保存为一个静态的,并在任务的稍后时间使用它,我会得到一个编组错误 - 基本上说明该对象被引用被编组到另一个线程。

我的C#知识是。我担心正在进行中。 到目前为止,我一直无法找到关于如何让webview响应内部任务的正确解释。可能吗?如果是这样,怎么样?

PS:最初的示例代码为:https://github.com/ms-iot/samples/tree/develop/IoTBrowser

回答

1

的问题是,我想告诉web视图导航至某个网页

根据您的代码段,你正在开发一个UWP应用程序。如果你想知道如何WebView浏览到一个网站,你应该能够使用的WebViewNavigate方法,例如:

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

下面的代码可以用来当浏览到所需的网站应用程序启动:

默认情况下的代码片段在OnLaunched导航到一页FrameFrame控件支持导航到Page实例,而不是网页,您无法通过Frame导航到网站。您的上述代码段只能让rootFrame导航到MainPage,而不是help.html。但是,您可以在MainPage上获取ms-appx-web:///help.html参数,并在MainPage上导航到WebView

我得到一个编组错误 - 基本上说明引用的对象被编组到另一个线程。

如果你想在不同的线程中调用UIElement,你应该可以使用Core​Dispatcher,不能直接调用。

总而言之,我认为你真正想要做的是从非UI线程导航到WebView网站。例如:

await Task.Run(Navigate); 
private async Task Navigate() 
{   
    try 
    { 
     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
     { 
      webView.Navigate(new Uri("http://www.google.com"));  
     }); 
    } 
    catch (Exception e) 
    { 
     Debug.WriteLine("{0} Exception caught.", e); 
    } 
} 
+0

是的,最后一个接近期望的功能。但是,不应该是:“”正在等待System.ServiceModel.Dispatcher.RunAsync“” - 这会导致在该名称空间中不存在指示“RunAsync”的错误。应包含哪些用途,或者UWP中不可用此功能? –

+1

@Thomas,不,它的类型是'Windows.UI.Core.Core Dispatcher'。我更新了我的代码片段以添加完整的参考,请检查。 –

+0

明白了,那有效。但是,我必须在OnLaunched期间保存对webview的引用(Frame frameFrame = Window.Current.Content as Frame; mainWindow = rootFrame),因为Navigate功能中不可用“webView”。但它现在正在按照预期进行导航,所以将您的解决方案立即标记为已接受 - 因为您的解决方案已达标。 –