【问题标题】:Is there any way to write a WinRt (Metro) app that will also work on Windows 7 and Vista?有没有办法编写一个也可以在 Windows 7 和 Vista 上运行的 WinRt (Metro) 应用程序?
【发布时间】:2011-11-17 16:24:56
【问题描述】:

我们不能让长期无法升级到 Windows 8 的客户束手无策。然而,我们的应用需要“平板电脑”/“触控”版本。

那么,我们如何才能通过单一代码库同时支持 Windows 8 上的 Metro 触控和我们当前的客户?

当 WPF 面世后,经过微软的大量“推动”并使其在 Windows XP 上运行——有没有关于 WinRT 的讨论。

(我不希望任何解决方案适用于 XP,因为 XP 支持正在逐渐减少。)

另见:Can the ARM version of Windows 8 only run Metro (WinRt) style apps?

【问题讨论】:

  • 不管有什么解决方案,很难想出一个既能方便地与鼠标/键盘和触摸一起使用的 UI。一般来说,即使您可以使用相同的 UI 框架,您仍然需要对两种交互模型的 UI 进行重大更改,以方便用户使用。例如。通过触摸,滑动是一种非常自然且方便的手势来更改视图,而对于鼠标/键盘,您需要某种标签切换器。

标签: windows-8 windows-7 windows-runtime microsoft-metro


【解决方案1】:

最好的答案是您不希望同一个应用程序在 Windows 7 和 Windows 8 Metro 风格上运行。最适合鼠标和键盘(Windows 7)的 UI 不适用于触摸优先演示,反之亦然。为两个不同的世界重新构想 UI 很重要。

也就是说,如果您想共享大量代码,您有两种选择: 1) 主要用 JavaScript/HTML5 编写。这将使您可以重用许多资产(尤其是业务逻辑部分)。 2)将其写入(桌面)Silverlight。 Silverlight XAML 最接近 Windows XAML。 WPF 距离更远,以后需要更多的返工。

在任何一种情况下,您都应该查看并遵循编写跨平台代码时使用的原则。了解平台依赖关系并将它们隔离在间接边界之后。您想要本地化所有必须更改的代码。例如,您不希望调用 .Net System.IO.File API,您知道这些 API 必须更改为分散在整个代码中的 Windows.System.Storage 调用。相反,您希望将其本地化为一个以后可以修改的函数。

【讨论】:

  • 我要强调的是,将尽可能多的逻辑分离到一个跨平台库中是很重要的。这样,您可以在共享大部分代码的同时,在未来添加对不同前端(Metro、传统 Win32 UI 等)的支持。
  • 要是有人告诉微软就好了。他们似乎在向两种类型的用户推送相同的开始屏幕界面。 :-)
  • Steve 很好地阐明了一些 UI 技术选项。如果您选择 .NET,那么可移植库也是您的业务逻辑的一个选项,并且可以让您对两个平台的相同代码库有更多的保证,因为它编译为相同的平台无关二进制文件:technet.microsoft.com/en-us/library/gg597391(v=vs.110).aspx
【解决方案2】:

我能想到的唯一方法是在 HTML5/CSS3/JS 中实现您的应用程序,并尽可能避免使用 WinRT API - 这可能是可行的,具体取决于您的应用程序需要做什么(例如便携式 2D使用 HTML5 画布可以轻松绘制图形)。

然后,对于 Win8,您将把它打包为 Metro Web 应用程序。对于 Win7 及更低版本,您编写一个简单的应用程序,嵌入您选择的浏览器(不是 IE9,因为它不适用于 XP - 所以 Firefox 或 Chrome)并隐藏所有 chrome,并在该嵌入式浏览器中加载您的 HTML5 应用程序。

【讨论】:

    【解决方案3】:

    正如其他人所指出的,您不希望完全相同相同的应用程序在 Win8 Metro 和 Win7 / Vista 桌面上运行。如果您使用合适的设计模式正确构建应用程序,则可以在您需要的各种版本之间共享相当多的代码。对于 Win8 版本,您将使用 WinRT,对于 Win7 / Vista,您可以选择 Silverlight 或 WPF。

    我已经发表了几篇文章来演示如何做到这一点,它们也包含相当多的代码:

    【讨论】:

      【解决方案4】:

      我们不太可能看到微软推出 Metro 风格 应用程序框架回到过去的版本,由于水平 Windows 8 中的重新架构。

      我同意Zac on this point。随着 Windows 8(和 Windows 运行时)的推出,微软似乎肯定推动技术和可用性。

      Metro UI 是一种不同的 UI 范例。如果您使用当前 Win32 控件(包括 WPF 控件),您的应用程序将 在地铁里看起来真的过时了。解决这个问题的唯一方法是 使用 Metro 重新实现 UI(MVVM 设计中的视图类) 控制。但是,C# 和大多数 .NET API 是一流的 在这个新环境中的公民。你的应用程序的其余部分应该 没事。

      由于您已经拥有我认为相当大的应用程序,因此您最好的解决方案是将您的 viewmodel-viewmodel 分开。然后,您可以继续开发 Windows 8 Metro 全屏触摸友好的真棒界面和“经典”窗口界面(我们在过去 x 年所做的事情)。通过良好的分离、设计和出色的源代码控制解决方案(即 Perforce),您将能够共享大量代码库。


      除了给your recent question on Windows RuntimeBill Wagner(我关注的众多C#博主之一)的答案之外,他还在WinRT and managed languages会议上发布了摘要;如果你有几分钟的时间,这是一本很好的阅读和推荐。他的总结澄清的一件事(在最后的常见问题解答中)是 .NET 作为我们使用的框架的 品牌 的未来将被取代Windows 运行时

      来自Bill's blog post的另一篇文章:

      一些 .NET API 正在针对 WinRT 进行更改。我没有 详尽的清单,我不确定是否还有。其他 API 不是 通过 WinRT 公开。 (它们仍然可以作为 .net API 使用,只是不能作为 Metro / WinRT API。)

      【讨论】:

        【解决方案5】:

        由于 Windows 8 的重新架构水平,我们不太可能看到 Microsoft 将 Metro 风格的应用程序框架推回过去的版本。

        就像 Pavel 所说,如果您尽可能多地阻止您的应用程序使用 WinRT 库,这是有可能的,但话又说回来,您现在正在构建一个常规的 Web 应用程序。

        【讨论】:

          猜你喜欢
          • 2011-12-13
          • 2020-07-21
          • 1970-01-01
          • 2012-09-18
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          • 2013-01-20
          相关资源
          最近更新 更多