WebBrowser控件无法触发事件处理程序

本文关键字:事件处理 程序 控件 WebBrowser | 更新日期: 2023-09-27 18:20:34

在特定情况下,WebBrowser控件无法触发NavigationCompleteNavigationFailed事件处理程序。

以下是应该发生的事情:

  1. 本机Windows Phone 8.1 Silverlight应用程序实例化WebBrowser,并为其提供加载身份验证网页的url
  2. WebBrowser控件加载url并呈现页面
  3. 用户输入凭据并点击提交按钮将信息POST到身份验证服务
  4. 身份验证服务验证证书并用302(重定向)进行响应
  5. WebBrowser控件跟随重定向
  6. NavigationComplete事件处理程序附加到控件。当它找到一个表示重定向成功的url模式时,它会执行一个额外的方法
  7. 附加的方法从重定向url查询参数中提取一个openid令牌
  8. 用户已通过身份验证并感到满意

实际情况:

用户在步骤#3提交凭据后,WebBrowser将呈现一个空白的白色页面,并且不会触发任何事件处理程序。代码正在侦听WebBrowser控件提供的每个导航事件处理程序。

我尝试过的:

  • 用测试heroku服务器尽可能地重新创建了这个场景。WebBrowser转到一个伪凭证输入页面,其中POST提交按钮再次点击heroku;heroku用302和真实的重定向url进行响应。WebBrowser运行良好O_O
  • WebBrowser添加了onTap事件,该事件检查当前url/导航到另一个页面,以查看空白页面错误后控件是否以某种方式被破坏。WebBrowser响应正确
  • 确保在控件上启用了Javascript
  • 使用与Windows 8平板电脑应用程序完全相同的服务器端基础设施,该应用程序共享90%的相同代码,但具有WebView控件。WebView运行良好

有什么建议吗?有人经历过这种控制行为吗?有人知道有一个图书馆可以解决这个问题吗(商业或开源)。适用于Windows的Android桥接器还是适用于Windows系统的iOS桥接器支持Windows phone 8?

WebBrowser控件无法触发事件处理程序

Dave,

WebBrowser控件被设计为直接在UI线程中工作,根据您上面所说的,您可能在非UI线程中运行它,在这种情况下,应该会出现意外行为。

如果是这种情况,您可能会尝试将线程转换为单线程单元(STA)线程,因为单元模型对COM组件(如ActiveX组件,WebBrowser属于该类)来说更为合适,您可以按如下方式执行:

yourThread.SetApartmentState(ApartmentState.STA);

有关STA线程的更多信息,请参阅本页。

由于WebBrowser控件是AciveX组件,因此此页面的内容也具有相关性,并指向相同的问题。

希望能有所帮助。)