【问题标题】:WebBrowser control as User InterfaceWebBrowser 控件作为用户界面
【发布时间】:2009-07-28 19:26:40
【问题描述】:

首先要明确一些定义。

用户:一个活生生的人,使用该软件

客户:为用户购买我们软件的定制版本的公司。

我们目前有一些应用程序需要根据用户所属的客户端对用户界面进行重大更改。我们目前为每个客户端单独构建,但随着客户端数量的增加,管理所有这些单独的版本变得越来越痛苦。

我的目标是切换到单个通用客户端,该客户端可以根据登录者动态定制。由于我们的软件无论如何都需要互联网连接(广泛使用网络服务),我正在考虑只在 .NET 中使用 WebBrowser 控件和允许它与计算机上所需的硬件进行交互(通过 ObjectForScripting)。

然后整个用户界面用 HTML/JavaScript 编写并存储在服务器上,从而使新用户界面的分发和维护变得轻而易举。通用客户端只不过是一个自定义 Web 浏览器,它知道如何与我们的硬件设备通信,并且可以通过 javascript 被告知这样做。

我看到这种方法有很多优点,但没有太多缺点。我错过了什么?为什么我不应该往这个方向走?

【问题讨论】:

    标签: .net winforms webbrowser-control


    【解决方案1】:

    有一些商业应用程序成功地使用了这种方法。以下是一些需要牢记的注意事项。无论如何,这些都不应该阻止您尝试这种方法。不过,要问自己的一个关键问题是,该应用是否可以改为原生网络应用。

    • Web 浏览器控件“吃标签”。您可以使用 tab 键将输入焦点从托管应用程序移到浏览器控件中,但您不能使用 tab 键离开它(除非您为此明确编码)

    • HTML/Javascript 应用程序是单线程的。如果您需要任何后台处理,您可能需要将该任务委派给托管应用。

    • 如果 Web 浏览器控件内部出现错误情况,它们将被视为脚本错误,并包含在控件内部。遏制是一件好事。但是您甚至可能没有意识到在构建/调试时发生了错误情况。

    • 如果没有网络连接,用户会看到浏览器的故障页面。你不能抢占先机并展示你自己的信息。

    • 根据您的应用程序及其实现方式,导航可能看起来比桌面应用程序中常见的慢。特别是页面重新加载。谨慎使用异步 AJAX 有助于缓解部分或全部问题。

    • 您的用户会知道他们正在使用网页。单靠 UI 设计将无法隐藏这一事实。响应能力和偶尔的失败将揭示这一事实。这对您来说可能是也可能不是问题。

    • 您的应用程序必须支持多个浏览器版本。 .NET Web 浏览器控件是用户机器上 Internet Explorer 实现的包装器。那将是 IE6、7、8 等,具体取决于那里安装的内容。

    【讨论】:

    • 支持多个 IE 版本应该不是问题。我们不会对 html/css 做任何非常棘手的事情。大多数页面将非常简单,并且只显示一个表单。对您的帖子进行一次更正,我们可以检测是否没有网络连接,我们可以不显示 WebBrowser 控件,或者我们可以将包含错误 html 的字符串/本地文件传递给它。
    • 蒂莫西,太棒了!很高兴听到您的 html/css 与相关版本的 IE 配合得很好。请注意,导致错误页面的浏览器故障条件可能更加微妙。连接可能是间歇性的,服务器可能已关闭,服务器上的应用程序可能已关闭,服务器可能返回 http 500 错误,服务器可能由于负载偶尔超时,等等。同样,不应该阻止你,只是提出问题
    【解决方案2】:

    WPF 不是为您提供了为不同用户轻松换肤的优势,同时保留了丰富的 UI 优势吗?

    【讨论】:

      【解决方案3】:

      这取决于应用程序的类型,但我不明白为什么这不起作用。可能的缺点:您必须使用 HTML 和 JavaScript,WebBrowser 组件依赖于已安装的 Internet Explorer 版本(并不总是相同),UI 不是真正的原生并且可能感觉像一个 Web 应用程序(不必成为劣势)。 如果我是正确的,我认为 Microsoft Money 的 UI 完全基于 WebBrowser 控件。

      【讨论】:

      • 拥有 HTML、JavaScript 和 CSS 的界面也是一个巨大的优势。有些事情要容易得多,例如将图像按钮和 url 链接合二为一;在 C#/Winforms 中,这可能是不必要的困难;在 HTML 中,这只是删除内部 标签的问题。
      【解决方案4】:

      如果您需要实现任何复杂的功能,我不建议您使用 WebBrowser 控件。缺点是:

      • 其行为取决于安装的 IE 版本和 IE 设置,但与“真实”IE 不同。我看到了一些情况,当 JS 功能在独立的 IE 中工作,但在没有任何明显原因的情况下在 WebBrowser 控件中不起作用(因此没有任何机会修复它)。

      • 很难自定义 UI(更改上下文菜单,制作一些复杂的事件处理程序),因为控件本身并没有暴露太多。因此,让它以您需要的方式与环境交互可能非常困难。

      您可以考虑使用完全基于 Web 的解决方案,在独立浏览器中工作 - 至少您不太可能在那里发现不常见的错误。小程序或 ActiveX 控件可用于与硬件交互。

      另一种选择是将瘦客户端开发为 Windows 应用程序,它会根据用户进行自我配置。如果您仍然需要嵌入浏览器,您可以使用 Gecko(Mozilla 的引擎)或 WebKit(Chrome 的引擎)——我没有任何实践经验,但可能它们在嵌入式和独立版本之间具有更高的一致性.

      【讨论】:

      • 我将不得不再次研究 activex 和浏览器插件,但我感觉通过插件/activex 控件公开硬件访问会比自定义浏览器解决方案更麻烦。如果 SilverLight 支持硬件访问,这会简单得多。
      • 无论用户通常使用什么,我认为 webbrowser 控件默认为 IE6 库。
      【解决方案5】:

      如果您不会因为切换到 Web 界面而失去重要的 UI 功能,我不明白为什么这不是一个很好的解决方案。

      【讨论】:

        【解决方案6】:

        实际上,这看起来是一个很好的解决方案。不过,我想到了一件事:

        为什么不直接切换到完整的 Web 应用程序?是否有某些事情您只能在浏览器之外的客户端执行?因为如果不是这样,您可能会通过将整个事物变成一个 Web 应用程序来大大简化您的部署场景。

        【讨论】:

        • 他有想要与之交互的定制硬件。
        • 啊,我错过了那部分。我的错。不过,这听起来是一个不错的解决方案。
        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 2023-03-18
        • 2018-09-28
        • 1970-01-01
        • 2011-06-07
        • 2015-12-25
        • 2011-08-01
        相关资源
        最近更新 更多