我们不能让长期无法升级到 Windows 8 的客户束手无策。然而,我们的应用程序需要“平板电脑”/“触摸”版本。
那么,我们如何才能通过单一代码库同时支持 Windows 8 上的 Metro 触控和我们当前的客户呢?
当 WPF 出现时,在微软看到了很多“推动”并使其在 Windows XP 上运行之后——有没有关于 WinRT 的讨论。
(我不希望任何解决方案适用于 XP,因为 XP 支持正在逐渐减少。)
我们不能让长期无法升级到 Windows 8 的客户束手无策。然而,我们的应用程序需要“平板电脑”/“触摸”版本。
那么,我们如何才能通过单一代码库同时支持 Windows 8 上的 Metro 触控和我们当前的客户呢?
当 WPF 出现时,在微软看到了很多“推动”并使其在 Windows XP 上运行之后——有没有关于 WinRT 的讨论。
(我不希望任何解决方案适用于 XP,因为 XP 支持正在逐渐减少。)
最好的答案是您不希望同一个应用程序在 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 调用。相反,您希望它本地化为一个以后可以修改的函数。
我能想到的唯一方法是在 HTML5/CSS3/JS 中实现您的应用程序,并尽可能避免使用 WinRT API - 这可能是可行的,具体取决于您的应用程序需要做什么(例如,便携式 2D 图形很容易使用 HTML5 画布)。
然后,对于 Win8,您将其打包为 Metro Web 应用程序。对于 Win7 及更低版本,您编写一个简单的应用程序,嵌入您选择的浏览器(不是 IE9,因为它不适用于 XP - 所以 Firefox 或 Chrome)并隐藏所有 chrome,并在该嵌入式浏览器中加载您的 HTML5 应用程序。
正如其他人所指出的,您不希望在 Win8 Metro 和 Win7 / Vista 桌面上运行完全相同的应用程序。如果您使用合适的设计模式正确构建应用程序,则可以在您需要的各种版本之间共享相当多的代码。对于 Win8 版本,您将使用 WinRT,对于 Win7 / Vista,您可以选择 Silverlight 或 WPF。
我已经发表了几篇文章来演示如何做到这一点,它们也包含相当多的代码:
由于 Windows 8 的重新架构水平,我们不太可能看到 Microsoft 将 Metro 风格的应用程序框架推回过去的版本。
我同意Zac 在这一点上。随着 Windows 8(和 Windows 运行时)的推出,微软似乎肯定在推动技术和可用性向前发展。
Metro UI 是一种不同的 UI 范例。如果您使用当前的 Win32 控件(包括 WPF 控件),您的应用程序在 Metro 中看起来确实过时了。解决这个问题的唯一方法是使用 Metro 控件重新实现 UI(MVVM 设计中的视图类)。但是,C# 和大多数 .NET API 是这个新环境中的一等公民。您的应用程序的其余部分应该没问题。
由于您已经拥有我假设的相当大的应用程序,因此您最好的解决方案是将您的视图与您的model-viewmodel分开。然后,您可以继续开发 Windows 8 Metro 全屏触摸友好的真棒界面和“经典”窗口界面(我们在过去x年中所做的)。通过良好的分离、设计和出色的源代码控制解决方案(即 Perforce),您将能够共享大量代码库。
除了对您最近关于 Windows 运行时的问题的回答之外, Bill Wagner(我关注的众多 C# 博主之一)还发布了关于WinRT 和托管语言会议会话的摘要;如果你有几分钟的时间,这是一本很好的阅读和推荐。他的总结澄清的一件事(在最后的常见问题解答中)是.NET作为我们使用的框架的品牌的未来将被Windows Runtime取代。
比尔博文中的另一篇文章:
一些 .NET API 正在针对 WinRT 进行更改。我没有详尽的清单,我也不确定是否有。其他 API 不通过 WinRT 公开。(它们仍然可以作为 .net API 使用,只是不能作为 Metro / WinRT API 使用。)
由于 Windows 8 的重新架构水平,我们不太可能看到 Microsoft 将 Metro 风格的应用程序框架推回过去的版本。
就像 Pavel 所说,如果您尽可能多地阻止您的应用程序使用 WinRT 库,这是可能的,但话又说回来,您现在正在构建一个常规的 Web 应用程序。