有没有办法编写一个能够在Windows 7和Vista上运行的WinRt(Metro)应用程序?

24
我们不能就这样把无法升级至Windows 8的客户长期搁置。然而,我们的应用程序存在“平板电脑”/“触摸”版本的需求。

那么,我们如何在单一代码库中支持Windows 8上的触摸和Metro以及我们当前的客户呢?

当 WPF 出现后,经过了大量的“推动”, Microsoft 回应并让其在 Windows XP 上运行 - 是否有类似于 WinRT 的解决方案被讨论过呢?

(我不指望任何解决方案能在XP上运行,因为XP支持正在逐步终止。)

另请参见:Windows 8 ARM版是否仅可运行Metro(WinRt)风格的应用程序?


3
无论采用什么解决方案,设计一个适用于鼠标/键盘和触屏的UI界面是非常困难的。一般来说,即使你使用相同的UI框架,你仍然需要显著地更改UI界面以让两种交互模式都对用户方便。例如,在触屏上,滑动手势非常自然和方便地进行视图切换,而在鼠标/键盘上则需要一种选项卡切换器。 - Pavel Minaev
5个回答

17

最好的答案是您不希望相同的应用程序在Windows 7和Windows 8 Metro风格上运行。对于适用于鼠标和键盘的UI(Windows 7),它并不适合于触摸为本的呈现方式,反之亦然。重新想象两个不同世界的UI非常重要。

话虽如此,如果您想共享大量代码,则有两个选择: 1)大部分使用JavaScript / HTML5编写。这将使您能够重复使用许多资源(特别是业务逻辑部分)。 2)使用(桌面)Silverlight编写。Silverlight XAML最接近Windows XAML。WPF则更远,并且以后需要更多的重新工作。

无论哪种情况,都应该查看并遵循编写跨平台代码时使用的原则。了解平台依赖项并将其隔离在间接边界之后。您希望本地化所有必须更改的代码。例如,您不希望对已知将需要更改为Windows.System.Storage调用的.NET System.IO.File API进行散布在整个代码中。相反,您希望将其本地化在一个可以稍后修改的函数中。


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

4
正如其他人所指出的那样,你不会希望在Win8 Metro和Win7 / Vista桌面上运行完全相同的应用程序。如果你正确地构建应用程序,并使用适当的设计模式,则可以在所需的各个版本之间共享相当多的代码。对于Win8版本,你将使用WinRT,而对于Win7 / Vista,则可以选择Silverlight或WPF。
我已经发表了几篇文章,演示了如何做到这一点,它们还包括相当多的代码:
- XAMLFinance - 跨平台WPF、Silverlight和WP7应用程序 - 尽管这篇文章没有涵盖Win8,但它共享了从WPF到Windows Phone 7的代码,这是一个非常相似的问题。 - TweetSearch - 跨平台Metro UI WinRT和Silverlight应用程序 - 这篇文章展示了如何使用相同的技术在WinRT和Silverlight之间共享代码。

4
我能想到的唯一方法是使用HTML5/CSS3/JS实现您的应用,并尽可能避免使用WinRT API - 这取决于您的应用需要做什么(例如,使用HTML5画布可轻松实现便携式2D图形)。
然后,对于Win8,您将将其打包为Metro Web应用程序。对于Win7及以下版本,您可以编写一个简单的应用程序,嵌入您选择的浏览器(不是IE9,因为它在XP上无法运行 - 所以是Firefox或Chrome),并在该嵌入的浏览器中加载您的HTML5应用程序。

2
“由于Windows 8进行了大量的重新架构,微软不太可能将Metro风格的应用程序框架推回到过去的版本中。” 我同意Zac 的观点。看起来微软肯定在通过引入Windows 8(和Windows Runtime)来推动技术和可用性的进步。 “Metro UI是一种不同的UI范例。如果您使用当前的Win32控件(包括WPF控件),您的应用程序在Metro中会显得非常过时。唯一的解决办法是使用Metro控件重新实现UI(MVVM设计中的View类)。但是,在这个新环境中,C#和大多数.NET API都是一流公民。您应用程序的其余部分应该没问题。”
由于你已经拥有一个我认为相当庞大的应用程序,你最好的解决方案是将你的视图(view)与你的模型-视图模型(model-viewmodel)分开。然后你可以继续开发Windows 8 Metro全屏触摸友好的界面和"经典"窗口界面(我们过去几年所做的)。通过良好的分离、设计和优秀的源代码控制解决方案(例如Perforce),你将能够共享很多代码库。
除了关于Windows Runtime的最近问题的回答之外,我跟随的众多C#博客之一的Bill Wagner发布了一个关于WinRT和托管语言会议的总结;如果你有几分钟的时间,这是一个值得阅读并推荐的好文章。他的总结在FAQ中澄清了其中的一些事情,即我们使用的框架将用Windows Runtime代替.NET作为品牌。

Bill的博客文章中还有另一篇相关内容:链接

一些.NET API正在为WinRT进行更改。我没有详尽的列表,也不确定是否已经有一个列表。其他API未通过WinRT公开。(它们仍然作为.NET API可用,只是不作为Metro / WinRT API。)

1

由于Windows 8进行了大量的重新架构,微软不太可能将Metro风格的应用程序框架推回到过去的版本中。

正如Pavel所说,如果您尽可能地避免使用WinRT库,那么这是可能的,但是您现在正在构建一个常规的Web应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接