Windows GUI:WPF或WinRT(2015+)


94

我试图概述在Windows World中构建GUI时要使用的不同技术。

对于上下文,我正在构建一个小的2D平台多人游戏。(仅出于学习目的。)

我的老师说他认为WPF是正确的方法,但似乎他只将它与Windows Forms进行了比较。

我的理解是,在2015年,Windows Forms完全死了吗?

在其他有关堆栈的问题中,他们说WinRT + XAML用于Metro GUI的构建(Window 8平铺东西!),而且WPF似乎仅用于Window 7/8中的桌面,并且与Silverlight密切相关。

Windows 8运行时(WinRT / Windows Store应用程序/ Windows 10 Universal App)与Silverlight和WPF相比如何?

  • 桌面是旧应用程序所在的位置(红色WFP)。
  • 新型应用程序Metro应用程序可以通过多种方式构建,包括通过VB.NET,C#或C ++。这三种语言选项可以使用XAML来构建UI。另一种选择是使用JavaScript / HTML5 / CSS来开发UI和应用程序代码。

我真正的问题是:在Window World中是否没有一种构建GUI的好方法?

如果没有,那么应该在Window 7,Window 8(台式机和Metro),Window Phone(和Windows 10!)甚至x-box上使用哪种技术。

这样对不同的技术进行比较吗?

您认为投资时间正确吗?


5
“ WPF还是WinRT?”。两者都学习,WPF用于桌面,Windows运行时用于移动设备。这些技术有很多共同点,例如XAML和非常相似的框架。您甚至可以编写可同时支持两种平台的代码,作为可移植类库。
克莱门斯2015年

2
@Clemens最后一点有点误导。必须重新构建/定位标准.NET库才能使用WinRT应用程序,这可能需要更改某些类的代码。
BradleyDotNET

3
Windows窗体还没有完全消失,但是除非您已经熟悉它,否则您可能不想使用它。
Casey 2015年

2
我认为,“在Windows GUI中保持最新状态”的目标相当有害。从长远来看,对于一般的开发者来说,这没有什么前途。MS已多次更改其GUI工具,而JavaScript和HTML5仍在不断发展。如果您以谋生为生,那就别忘了。如果您正在为MS或GUI 3rd party供应商工作,或愿意坚持维护旧代码,则很少有例外。
NoChance

3
甚至MFC也不是完全失效,也不是Win32。但是狂热分子会选择MFC玩游戏
Lothar

Answers:


132

这里有很多东西,但是去了:

  • Windows Forms(Winforms)是否死了?不。它仍在积极支持。也就是说,这是一种可怕的技术(至少一旦您知道WPF的魔力)
  • 如果您想构建外观精美,设计良好的桌面(经典而不是Metro)应用程序,那么WPF就是纯.NET的答案。您可以使用WinRT API(例如它们的套接字类),但是不能在Windows 8之前的操作系统上运行它们。UI仍然是WPF。
  • WinRT应用程序适用于Windows 8应用商店(在Windows 10应用商店中也提供)。您不能在此处使用WPF,也不能在台式机上使用WinRT,因此部署位置决定了使用的是什么。您对可用语言/技术的理解是正确的。
  • Windows Phone 8(现已弃用)使用经过修改的WinRT运行时(在Windows 10中已更改)。对于Win8 / WP8,您可以使用“通用”应用共享在标准WinRT应用和Windows Phone应用之间大多数代码。
  • Windows 10使用基于.NET Core的通用Windows平台(UWP)。为Windows 10开发的代码也可以在Xbox One,Windows Phone 10和HoloLens上使用。WPF仍适用于“标准”桌面应用程序。
  • XBox非常棘手。XNA已经消失了,微软似乎正在远离社区为该平台创建的内容。就是说,Unity3D可以部署到XBox,并且我相信标准DirectX(C ++)开发可以为此工作。通用Windows平台应用程序也可以部署在Xbox One上,这似乎是微软未来的战略。

至于花什么时间,这取决于您的目标:)。如果您想在.NET GUI开发中保持最新,那么学习WPF / UWP + XAML将为您带来很多好处,这就是我想要的。WPF具有最多的功能,因此从那里开始,您只需要找到UWP(或任何其他基于XAML的技术)中缺少的解决方法。

如果这样做,请确保学习MVVM(模型-视图-视图模型)模式。它真的有效与基于XAML的技术有效,并允许您在WPF和UWP应用程序之间共享很多逻辑。如果最终为iOS / Android等开发Xamarin应用程序,则也可以使用相同的逻辑。

请注意,对于真正的游戏开发,您需要一个实际的游戏框架(例如Unity3D甚至XNA)。您可以在WPF中完成此操作,这是比Winforms更好的选择,但两者都不是真正适用于游戏的。


感谢您的回答,我的迷你游戏以XNA开始,所以很遗憾听到他们将其删除的消息。但是我很期待看到Windows 10将带给我们什么。
Alf Nielsen

@AlfNielsen我不确定支持的终止时间,但显然他们不会很快更新它。
BradleyDotNET

2
看起来VS正要为Unity提供全力支持,因此在预测这一点时应赞誉!:)
BK 2015年

2
使用诸如视觉之类的WPF类的WPF渲染速度对于游戏或任何实时性而言都是可怕的。
温格·森登

2
@WingerSendon看看RenderTransformViewport3D等等。它们是硬件加速的。
BradleyDotNET

26

这是一个很老的话题,但是就像我通过google遇到这个话题(出于兴趣),也许其他人也可以到达这里。这是新程序员反复提出的一个问题。因此,既然Windows 10正式发布,我也想回答几件事。

首先,不应再从Windows Forms开始。它是目前最成熟的技术,但是Windows Forms不会有任何进一步的开发,它只是处于维护阶段。WPF正在积极开发中(我最后阅读)。但是现在,Windows通用应用程序(一个WinRT)不再需要全屏使用,可以像其他桌面应用程序(WPF和WinForms)一样在窗口模式下使用。这大大提高了它们在非平板电脑上的可用性。我相信这也是台式机应用程序的未来。虽然,WPF软件是传统的桌面应用程序(没有权限,只有UAC)。无论哪种方式,无论您学习WPF还是WinRT(使用.Net)开发,都将同时学习两者。它们都是XAML + C#(或其他某种.Net语言)。WinRT随Win​​dows 8一起发布时,我只是在学习WPF。我感到很宾至如归,只有很少的改动很快就习惯了。虽然不确定WinRT中的MVVM场景(数据绑定)。我自己仍在学习WPF的这一方面。

窗口10刚刚启动。Windows 8 / 8.1并没有Windows 7那样成功。因此,如果您要构建具有更广泛受众的应用程序,则应该暂时使用WPF。但是在不久的将来,WinRT将成为必经之路。

对于您的问题,“在Window 7,Window 8(台式机和Metro),Window Phone,(以及Windows 10!)甚至x-box 上应该使用哪些技术。”,唯一的答案就是Windows Universal Apps。这就是开发此框架的确切原因。一种用于为所有设备开发应用程序的技术。台式机,平板电脑,电话(包括使用与Visual Studio 2015捆绑在一起的Xamarin的Android),Xbox和IoT(物联网)。


19
Universal Apps似乎无法在Windows7或Windows8上运行。“通用应用程序”仅对Win10设备“通用”。
Dragontamer5788 2015年

Xamarin仍然是自己的东西(没有Universal Apps),我不确定它们是否也可以部署到Xbox。
BradleyDotNET

2
@PrateekJain:在Windows 8上运行UWP应用程序时否: stackoverflow.com/a/30317960/199364
ToolmakerSteve16年

6
WinForms仍然适用于快速,肮脏的GUI-WPF很好,但是即使没有MVVM,也需要大量样板代码(以及陡峭的学习曲线)才能“正确”使用。令人惊讶的是WPF没有真正的RAD功能-XAML太冗长了
戴(Dai)

1
对于我所有的设备。这是微软最好的发言。就像过去他们跨平台调用它一样,因为它运行在Windows95和Windows2000上。另一件事是,我从不希望桌面应用程序具有相同大小的丑陋按钮,尤其是我必须用于触摸的树和列表。在没有UWP的情况下
Lothar

23

我将只回答您的一个问题:

Windows Forms完全死了吗?

不,Windows窗体技术还没有死。我会告诉你为什么。WPF和XAML是非常全面和复杂的技术,您可以构建非常好的UI。但!这项技术需要深入的知识。对于基本布局,您不需要太多知识,但是对于某些高级布局,您应该具有丰富的知识,当我开始使用这项技术并花了大量时间在Google上搜索一些技巧时。因此,当我需要一些简单的Forms进行用户输入时,我总是选择非常简单明了的Windows Forms技术。这也是该技术在世界上获得成功的原因。当您从WPF开始时,您还需要了解什么是MVVM设计模式,一些没有经验的程序员对此感到困惑。


3
这是我最喜欢的答案。对于小型应用程序,我使用Windows窗体,因为它是如此快速且容易上手。对于复杂的生产代码,我完全使用C ++(带有WTL)和完全避免的.NET。
罗宾逊

8
对于不熟悉WPF的读者,需要做一些澄清-对于基本的应用程序布局,WPF或多或少需要付出相同的努力。默认的VS WPF应用程序模板提供与WinForms相同的起点。MVVM并不是必须要与WPF一起使用,但是对于简单的应用程序,实际上在没有任何MVVM框架的情况下使用Binding也很容易。WPF在技术上与WinRT和UWP更为接近,因此请您自己考虑Windows Forms除了维护旧版应用程序外,还会因为其他任何原因失效。

3
Winforms非常适合构建新时代的“控制台”应用程序。例如,极其基本的选项卡控件,带有一堆按钮和用户输入,可以有效地使皮肤平时通常是控制台应用程序。

16

现在是2016年4月,对此尚无明确答案。我们正在开发一个非常现代的实时性能监控桌面应用程序,该应用程序必须呈现多个图表和显示,并与文本和其他各种图形混合在一起。我们的应用程序是C#,带有.NET Framework 4.5.2的WPF,但我们仍在使用WinForms和GDI +编写一些组件,以获得可接受的性能。我们只是没有用WPF实现它。我们甚至已经使用DirectX在应用程序中开发了几个显示器,但这增加了很多复杂性,只有少数团队可以支持。通过在WPF中托管WinForms显示,我们可以得到简单和纯净的速度,而GDI +的速度给我们提供了所需的东西,而昂贵的纯净View / ViewModel结构以及必须处理各种空域问题。我们的应用程序非常专业,我很想完全摆脱WinForms,但不幸的是,在我们的情况下这还不可能。为了获得纯性能,您将需要使用DirectX或WinForms。


1
我会告诉你,有些东西在WinForms中表现更好。相反,还有其他事情(尤其是动画)。诚然,直接使用DirectX可能会更好,但正如您指出的那样,没人愿意这样做。
BradleyDotNET

1
WinRT之后,我决定开始寻找其他地方。我和我的客户不能过多依赖Microsoft的需求,因为这会影响我和客户的底线。我现在正在看一个自托管的应用程序,该应用程序使用本地网络服务器在WinForm / WPF应用程序中为用户的浏览器或嵌入式浏览器控件本地提供应用程序页面。这简化了开发,使我更接近跨平台兼容性,并且明显降低了成本。
TheLegendaryCopyCoder

6

我的两分钱。。。如果您想要真正的通用应用程序,这意味着可以在包括Windows在内的任何桌面操作系统上运行的程序,WinForms仍然是可行的方法。只要确保您保持CLR兼容性,就可以通过Mono在Mac和Linux上进行部署。巨大的好处。XAML可能很酷,但是不会移植到其他操作系统。

我个人觉得UWP商业模式沙盒化(令人讨厌吗?);它抵消了Windows从一开始就代表的开放性。


4

我使用Microsoft技术已有10多年了。我学到的最重要的事情不是只听微软为您提供的服务。当微软说是未来时,它有50%的机会出错。微软肯定会竭尽所能来推广他们投资的产品,但这并不意味着您应该遵循。看看WCF和Silverlight发生了什么。

尽管WPF是一个非常好的学习平台,但它具有巨大的学习曲线。我认为任何具有不到5年编程经验的开发人员都不会做WPF。

通过遵循MVVM模式,您将发现在WinForm中做相对容易的事情在WPF中会变得非常具有挑战性。就像在更新后根据某种条件为单元格着色,或在视图中滚动一行并使其高亮显示。

当然,您可以说不必做MVVM。只需将您的代码放在代码后面并使其工作即可。是的,这将起作用,但是使用WPF有什么意义呢?为什么不只使用Win Form?


1
我会同意WPF具有很强的学习曲线,但是一旦您克服了这一点,就永远不会回到WinForms ...了。
Krythic

4

这是一个旧线程,但随着.NET框架的最新进展,c#功能以及对c#作为游戏开发选择的关注,该线程很重要。

老实说,WPF几乎从未被选作ac#游戏平台。WPF的空域问题使人们很快逃离。因此,我认为许多(如果有的话)主要游戏或主流游戏引擎都不支持WPF作为目标平台。WPF为游戏启动器提供了一个绝佳的平台!

WinForms虽然现在处于维护模式,但在未来几年仍将是有效的选择。经过时间考验且稳定。据我了解,即使在2017年,WinForms仍然是基于c#的游戏开发所选择的最常见平台。

查看Steam硬件调查数据,您会发现在撰写此答案时(2017年7月),Windows 10 64位现在是PC游戏平台的主要市场,占有50%的市场份额,其次是Windows 7 64位的32%和Windows 8.1 64位(几乎占7%)。所有其他OS平台的市场份额都很小,除了这三个之外,几乎不值得考虑。

以此作为PC游戏的当前状态,WinForms是针对所有三个顶级PC平台的最常见的分母。展望未来,UWP将是c#游戏开发的最佳目标平台,因为Windows 7和8将失去Windows 10的显着市场份额,除非有新平台取代它。所以这只是数字。

如果基于每个OS平台的最佳兼容性级别进行选择,而不是支持最大的市场份额,则选择将更像:

  • Windows 10:UWP
  • Windows 8.1:WinRT或Windows Store
  • Windows 7:WinForms

其他大多数答案都围绕标准Windows应用程序开发而来,但是游戏开发是一个截然不同的领域,不同的因素会影响您的选择,例如目标操作系统以及您选择的图形API或游戏引擎实际上最能支持什么。


尽管对gamedev的观点很有趣,但我不明白为什么您会选择gamedev的GUI框架,其中拥有Unity等C#的全功能游戏引擎。只有在它经典的GUI几场比赛我看到的是游戏数据版本(如地图/资产编辑)
Uwy

2
出于同样的原因,他们选择了一个游戏引擎:依靠自己的托管代码有效地创建和管理本机窗口需要大量工作。
迈克·约翰逊

3

WinRT已经在桌面上存在很长时间了,我正在写WinRT,它可以在桌面上运行。在Windows 10下,这些应用程序将支持非停靠的位置(如您传统上所知道的那样显示在窗口中)。

我不会向今天开始的任何人推荐WinForms或WPF。他们应该首先学习WinRT / XAML。根据他们的选择语言,根据需要学习一些Win32 / .net。

“他们说WinRT + XAML是用于Metro GUI的构建(Window 8可以铺砌东西!)。”-这太抽象了,没用。WinRT是与Win32一样的运行时,它不仅用于GUI,所以“他们说”是完整的BS。XAML是一个UI层(很像WPF中的XAML),但是说它的Metro GUI也是错误的,不再有Metro GUI这样的东西。XAML是Windows UI层。还有“ Windows 8瓷砖的东西!” 表达某些人的隧道视野。就像我说Win32是开始菜单一样。您可以看到该声明多么荒谬。


8
为了澄清我的原始说法,WinRT不能用于创建“传统”桌面应用程序。出于这个原因,除其他外,还有的理由来学习WPF(的WinForms,没有这么多)。如果没有其他要求,您将同时有效地学习了WinRT(正如我在回答中所指出的)。此外,我们距离WinRT应用程序统治市场(尤其是商务应用程序系列)还差得远。WPF仍然非常有价值。
BradleyDotNET

7
如果WinRT与构建全屏应用程序无关,您能告诉我如何使用它来构建可在任何实际发行的Windows版本上运行的窗口化应用程序吗?或者如何使用它编写可在超过10%的Windows计算机(即Windows 7和XP)上运行的应用程序?我猜想大多数开发人员都希望能够定位超过10%的Windows用户。在Windows 8或10获得大量市场份额之前,WPF对于许多应用程序仍将是必需的。WinRT可能是运行时层,但这并不能改变它无法访问Win32可以访问的许多东西的事实。
John Colanduoni 2015年

1
@JohnColanduoni如他所说,对于从今天开始(3月14日)的任何人来说,WinRT都是必经之路,win10曾经并且现在免费提供几个月的更新,并且还将持续几个月,所以是的,win10正在抢占巨大的市场份额。是的,不是所有人都迁移到win10,但几天前,我们发现法国的机场仍使用win3.1
John Demetriou

3
@GavinWilliams好的,您的统计数据使Windows 10在任何细分市场中均占有可观的市场份额?您是说mods删除了您的注释,并带有指向您的源的链接,但是他们让您提出了这一点?我不买那个。我同意XP不值得支持,但是Windows 10通用应用程序甚至不支持Windows 8.1,更不用说Windows 7了。采用它在证明Windows通用性的地方无处不在,而且它正在放缓
John Colanduoni 2015年

3
@GavinWilliams好吧,让我们忽略了30%,是一个很大低于97%(如果你使用WPF,你会得到您的支持),并且该数据仅用于视频游戏程序员有用。对于视频游戏,同时定位这两个目标很容易;除非您做的事情确实很琐碎,否则您将要使用DirectX / OpenGL,这意味着您只需要在窗口/全屏中托管它即可。如果您不想使用它们,那么您真的会想要WPF,因为WinRT的UI不允许在没有托管DirectX / OpenGL的情况下进行即时模式绘制(就像WPF那样)。那么WinRT可以证明将市场规模缩小70%是合理的吗?
约翰·科兰多尼

1

大约一年前,我遇到了这个问题。我得出的结论是XAML,WPF和WinRT都是正确的开发环境。

我强烈建议将.Net Framework用于数据层(包括Web服务和RESTful层(JSON)),并将纯HTML5 / CSS3和Javascript用于Web表示层。

在Windows 10中,您可以直接将任何Web应用程序集成为Metro应用程序。

WinRT,XAML,WPF和类似的ms内容仅在Windows上运行,并且有很多限制。

因此,一年后,我仍然对不为新项目使用WinRT或XAML的决定感到非常高兴。


3
你在说什么?是的,如果您想制作一个Web应用程序,那是一个不错的选择。如果要制作桌面应用程序,则不是。您可以使用Katana并拥有本地托管的WebApi并制作一个桌面应用程序,我想这会使此答案更加相关。
凯西

1
OP询问有关Windows GUI和WPF或Winrt的问题-而不是Web应用程序。
ezaspi '16

6
另外,我个人觉得这些技术很多难以用(不可理解的布局系统,对代码没有编译时检查等)的台式机还没有死:)工作
BradleyDotNET

1
我同意,HTML是通用UI,也应该用于桌面。我觉得我们需要简化所有这些不同的框架,并停止引入越来越多的框架。大多数都不需要。只需学习HTML和ASP,然后在WinForm应用程序中自托管您的网站即可。WinForm应用程序包含您的Web服务器和Web浏览器控件。结果是,您可以节省时间,专注于一种语言和技术的掌握,开发人员的速度更快,可以节省客户的钱,您的应用程序可以面向未来并且可以移植得多。
TheLegendaryCopyCoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.