Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebView.CapturePreviewToStreamAsync()失败,但仅在使用Unity3D的HoloLens上失败_C#_Xaml_Unity3d_Webview_Hololens - Fatal编程技术网

C# WebView.CapturePreviewToStreamAsync()失败,但仅在使用Unity3D的HoloLens上失败

C# WebView.CapturePreviewToStreamAsync()失败,但仅在使用Unity3D的HoloLens上失败,c#,xaml,unity3d,webview,hololens,C#,Xaml,Unity3d,Webview,Hololens,目前,我们正在尝试在一个应用程序中结合使用Unity3D全息图和HTML呈现。这个想法的作用如下: 1) 启动主窗口包含WebView组件的XAML应用程序(使用XAML应用程序模板) 2) 切换到全息(DirectX)模式(基本上是从全息应用程序模板复制代码) 3) WebView仍在后台运行 4) 我们可以调用WebView.Navigate()方法 5) 通过CapturePreviewToStreamAsync()API将WebView的内容呈现为位图 6) 将位图转换为纹理,并在Dir

目前,我们正在尝试在一个应用程序中结合使用Unity3D全息图和HTML呈现。这个想法的作用如下:

1) 启动主窗口包含WebView组件的XAML应用程序(使用XAML应用程序模板)
2) 切换到全息(DirectX)模式(基本上是从全息应用程序模板复制代码)
3) WebView仍在后台运行
4) 我们可以调用
WebView.Navigate()
方法
5) 通过
CapturePreviewToStreamAsync()
API将WebView的内容呈现为位图
6) 将位图转换为纹理,并在DirectX端显示它-从而使用全息图进行HTML渲染

到目前为止,我们的实验在:
1) C++/CX
2) #

但是,如果我们尝试用Unity3D做同样的事情,我们会遇到问题。下面是我们要做的:
1) 我们创建了一个具有混合现实支持的Unity3D项目
2) 我们导出Unity项目,将“UWP构建类型”设置为“XAML”(而不是D3D)。 该应用程序在MSVS 2017中构建,并作为XAML应用程序启动,自动切换到全息空间,正确显示Unity中定义的场景。
3) 我们进一步编辑主XAML页面以包含WebView元素(指向网页)

现在,如果我们调用WebView组件的
CapturePreviewToStreamAsync()
API System.Exception随消息一起引发: 灾难性故障(HRESULT异常:0x8000FFFF(E_意外))

如果我们同时使用全息透镜眼镜和仿真器,误差是100%可再现的

有什么建议可能是这种行为的原因吗?Unity似乎以不同的方式创建应用程序XAML部分的主窗口,但我们无法访问该窗口,因为窗口创建主要发生在重新编译的Unity模块中

谢谢!
Martin

尽管我们找不到异常的原因,但我们还是找到了一个解决办法,按照Jonathan Antoine在本博客中的说明进行操作:

使事情顺利进行的方法是:
1.为上面生成的Unity3D应用程序创建一个新的XAML页面(命名为WebViewPage,它包含我们的WebView组件)
2.修改Unity生成的XAML应用程序,以便在启动时导航到WebViewPage,而不是主页
3.当需要切换到全息空间时,只需按常规方式导航到主页:

    var frame = new Frame();
    Window.Current.Content = frame;
    frame.Navigate(typeof(MainPage));  
四,。您可能还需要将
appCallbacks
对象从生成的应用程序从
app
类移动到
MainPage

这就解决了问题。现在,
CapturePreviewToStreamAsync()
调用工作并返回数据

注意:我们注意到应用程序使HoloLens emulator(10.0.14393.1358)处于某种状态,不允许在不重新启动emulator的情况下再次启动应用程序。但这个问题并没有在真正的设备上出现

希望能帮助别人

马丁你好!我目前正试图弄清楚这一点。你能在3D空间里工作吗?您是否能够异步更新页面?还是仅仅是你能显示的一种状态?另外,在DirectX中,如何将位图传输到纹理?在这方面遇到了很大的困难,慢慢地变得疯狂,任何帮助都会令人惊讶。嗨,我们确实成功地使它工作了,但它是我以前工作中的一个项目的一部分,所以不幸的是,我将无法提供任何额外的源代码。我们进行了实验,我们能够在全息模式被激活后将HTML页面加载到webview中,提取它,然后显示它。更具体地说,您是在询问如何将位图数据转换为DirectX纹理,还是在同一个应用程序中同时使用DirectX和XAML?我也许还能提供一些指导方针!非常感谢你回复我。我已经为此绞尽脑汁好几天了,现在我想用Unity来代替directX。我现在的具体问题是:我与webview有一个单独的视图,但我仍然面临灾难性的失败。我不知道如何将appcallbacks移动到我的新视图。这是消除错误的一个关键部分吗?实际上我认为我已经做到了。原来我调用主页时出错了,我使用了您的代码片段作为总页面调用。但是使用
CoreApplication.CreateNewView()etc就是这样做的。我认为错误与不同的调度程序有关,通过显式创建一个新视图,您可以得到一个用于Unity的新调度程序,以及一个用于XAML UI的新调度程序。非常感谢你的帮助!