代码之家  ›  专栏  ›  技术社区  ›  DanDan

Windows窗体是旧技术吗?

  •  26
  • DanDan  · 技术社区  · 15 年前

    现在是为我的项目编写GUI的时候了,我想知道应该使用什么技术。我在.NET 1&2中开发了大部分.NET GUI,所以我知道 Windows Forms 相当不错。我隐约意识到 WPF 但尚未尝试“进入”。

    窗户是死了还是死了?WPF是一种很好的学习技术吗?这是一个未来,仅仅是一个阶段,还是一种可以与Windows窗体携手同行的技术?

    此外,任何经验都会很好地听到,尤其是从那些广泛使用两者的人那里。您如何发现在两个框架中实现类似的特性?

    11 回复  |  直到 8 年前
        1
  •  45
  •   Pavel Minaev    15 年前

    温弗斯死了还是死了?

    不,它没有显著的进一步发展(即没有新的 专业 例如,它在.NET 4中是完全支持的。

    WPF是一种很好的学习技术吗?

    对。

    它是未来,仅仅是一个阶段,还是一种可以与WinForms携手同行的技术?

    它的目的是最终转移到WPF,但它也被理解为有大量现存的代码库是用WinForms编写的,并且没有在WPF中重写它们的商业理由。因此,WinForms仍受支持。

    此外,任何经验都会很好地听到,尤其是从那些广泛使用两者的人那里。您如何发现在两个框架中实现类似的特性?

    从广义上讲,WPF更具表现力。如果你把框架看作一组乐高积木,它们可以以各种方式组合在一起,那么Winforms积木要大得多——每个积木都有很多作用——因此将它们组合在一起的方法就更少了。通常,当你需要一些东西,但不是像现有的砖块那样,你必须从头开始写。在WPF中,砖块明显更小,可以以许多有趣甚至令人惊讶的方式组合。

    对于一个具体的例子,考虑一下wpf Button 是一个可以承载任意内容的容器——不仅仅是WinForms中的图像+文本,而且绝对可以承载任何其他WPF控件或控件集。

    与WinForms相比,WPF也更容易编写动态布局。后者也有布局,但问题是它们是在可视化设计器中使用的皇家pita,用代码编写WinForms组件初始化非常繁琐。使用WPF,只需手工编写XAML标记,布局(和一般的控制树)就可以很自然地用XML表示。

    部分源于以上,我发现WPF更容易本地化。首先,这是因为您确实需要动态布局来实现本地化(因为您不预先知道所有区域设置中字符串的长度)。Winforms对此的解决方案是不仅考虑文本标签,还将控制位置和大小作为“可本地化属性”-因此,如果翻译器发现字符串不适合,则应该重新排列表单上的控件。在WPF中,动态布局是默认方法,因此本地化器只处理字符串。

    WPF绑定框架相当强大(即使是冗长的,由于缺少内联转换器),它极大地促进了MVP,并且通常还促进了模型/视图分离。使用WinForms在2.0+中可以实现这一点,我也尝试在那里实现这一点,但这更为繁琐,尤其是在处理空值时,有时可能会 rather buggy .

    一个特别的痛点是WinForms设计器与源代码管理交互的方式。这里有两个类似的问题。首先,设计器将编辑过的表单序列化为代码,有时布局中非常微小的更改会使设计器生成完全不同的代码(如果编辑工具栏,这一点尤其明显),因为它会左右移动代码行-即,实际上,它在一行上更改了单个属性值,但它也会对每一行进行重新排序。g.这在历史上引起了很大的噪音(在查看diff时几乎不可能知道到底发生了什么变化),但更重要的是,这意味着合并这些文件是一个主要的难题。当两个人同时使用同一个表单时,通常会发生这种情况,一个人提交他的更改,另一个人尝试提交,同时发现文件已更改,尝试合并,查看差异,并跳出最近的窗口。

    当您使用WinForms可本地化表单时,会发生一个非常类似的问题,它将一些属性推送到资源文件中。同样,设计器非常喜欢对资源文件中的属性值进行重新排序,以便进行任何细微的更改,问题与前面描述的相同。

    关于水渍险的不足之处。一个主要的问题是,它相当复杂,并且对于那些只熟悉winforms、vcl、vb或其他类似的“传统”框架的人来说,可能会感到不熟悉。另一个问题是,在我看来,文档不是完美的——它通常提供了一个不错的概述,但很少涵盖角落案例,其中一些案例可能非常重要。WinForms也是如此,但可能的组合更少,因此角盒也更少。

    还有第三方组件的问题。WinForms已经存在了很长一段时间了,现在有很多可用的,其中很多都非常成熟。WPF相对来说还很年轻,而且仍在经历成长的痛苦,因此大多数第三方解决方案都是如此。

    我在WPF中的一个特别之处是它消除文本失真的方式——大多数人认为这种方式比普通的Windows ClearType质量差得多,尤其是在小字体上;请参见 this bug report 更多信息。这是在WPF 4中修复的,但它还没有发布,即使它将被发布,也有可能您希望在一段时间内坚持使用试用版和真正的3.5 SP1;并且修复不会被反向移植。

        2
  •  11
  •   Justin Niessner    15 年前

    WinForms并没有死,也没有死……它们只是不能提供与WPF相同的用户体验(没有很多工作)。它们只是旧技术。

    WPF是一种很好的学习技术。它提供了以更少的工作量提供更丰富的用户体验的能力。

    使用WPF的模型与WinForms绝对不同。我已经使用了这两种方法(WinForms比WPF/Silverlight要重),对我来说最困难的转换是:

    1. XAML,如果您有使用另一种标记语言(如MXML)的经验,这并没有那么糟糕。

    2. 数据绑定

    3. 接口事件处理(鼠标悬停效果、时间线等)

        3
  •  4
  •   Agent_9191    15 年前

    Winforms远非死亡/死亡。WPF只是处理UI的一种新方法,因为它促进了WinForms中更困难的事情。像将用户界面后面的模型与实际的用户界面分开这样的事情是一个很大的因素,这样可以很容易地对其进行测试。

    这绝对值得学习,但是一定要学习创建屏幕的“wpf方法”,而不仅仅是将winforms方法融入其中。这是一种不同的编码方式。

        4
  •  3
  •   Arin    8 年前

    2016年展望:

    我不经常提倡在这个老问题上插嘴,但我认为结尾语可能适合这个问题。为什么?因为即使是现在(2016年),我也听说公司环境中的开发人员 仍然 问这个问题。

    是的,七年后,WinForms仍在公司环境中运行,并且仍然得到微软的支持。 Google Trends 从2005年中期开始,利率缓慢稳定下降,目前的利率约为2005年利率的三分之一。

    WPF在2009年引起轰动,但从未完全取代它作为新UI开发的事实标准。谷歌趋势显示,WPF的兴趣从2009-2011年达到峰值,然后比Winforms下降得更快。目前的搜索兴趣大约是2011年的一半,但仍然几乎是Winforms当前搜索兴趣的两倍。

    那么开发人员现在在使用什么呢?基于网络的用户界面(uis)已经迅速流行起来,这主要是由于移动浏览的兴起。你可以为写Web用户界面(angularJS+webapi)的最佳方法争论一下。ASP.NET MVC?反应?所有这些都在谷歌趋势上呈上升趋势)。无论您使用哪种技术,都很难否认一次性编写(响应)UI并让它在几乎所有设备和平台上工作的吸引力。云托管服务通过以低前端基础设施投资提供几乎即时/无限的扩展,进一步推动了对网络的推动。

    所以今天,我衷心地建议您转向Web用户界面,因为它可能会提高应用程序的保质期——在公司环境中通常需要很长时间。或者,如果你是一个从事移动开发的微软开发人员,Xamarin值得一看。

        5
  •  2
  •   Eric J.    15 年前

    WinForms在公司环境中可能会存在很长一段时间。它们在许多方面都能很好地工作。许多项目都是基于WinForms的,许多公司将在项目期间坚持这种技术,而不是混合匹配。

    既然如此,WPF就是未来。它是一种效率更高、功能更强大的用户界面技术,值得学习。

    WinForms和WPF可以在单个应用程序中共存。这可能是他们被介绍给公司的最常见的方式(以及概念验证项目)。

        6
  •  1
  •   Finglas    15 年前

    当然不是。

    WinForms更容易使用(考虑到您还不知道WPF),而且WPF与WinForms模型有很大的不同。

    如果你想要一个简单的图形用户界面(标准的表单材料),就用WinForms。如果你想要一些更华丽的东西,有时间,去WPF。

    我相信在将来会有一个点,即水渍险是脱脂标准。但是现在,如果我想要快速和干净的东西,我还是坚持使用winforms。

    值得一提的是,许多应用程序已经在使用WinForms,这意味着维护工作通常会突然出现,涉及到WinForms,所以不要马上取消。

        7
  •  1
  •   Dave Swersky    15 年前

    Winforms没有死。谷歌“winforms c jobs”,你会发现很多。WPF是热门的东西,但它还是相对较新的。再过两年到三年,它将不再是主流。

        8
  •  1
  •   David Basarab    15 年前

    这是一个好消息 blog post 关于WinForms和WPF。总体的想法是明智的选择,这意味着没有一个能战胜另一个。每个都有不同的功能子集。

    然而,在WPF和WinForms之间做出决定是另一回事。当然,wpf是新的热点,winforms是旧的和坏的,但它是正确的选择吗?显然,“这取决于”具体情况,微软将继续提供和支持WinForms,因此它不会很快消失。那么,选择WPF而不是WinForms的强制因素是什么呢?卡尔在他的WPF业务应用程序系列中暗示了WPF对WinForms的选择,但原因可能对某些人来说是微妙的。

    我个人更喜欢WPF,因为我从Web开发人员开始,发现标记XAML更自然。

        9
  •  1
  •   TabbyCool    15 年前

    我认为在WPF成为主流之前学习它是绝对值得的,提高你的技能和拥有新技术的经验和知识总是一件好事,特别是如果WPF在未来被更广泛地使用。

    此外,虽然编写XAML标记与创建表单非常不同,但它离编写HTML不远,而且如果您进行了任何Web开发,它可能不会对您造成太大的影响。

    虽然WinForms是一种古老的技术,但并不意味着它将永远消失,但我们仍然有用VB6编写的应用程序。只有一半的开发部门使用.NET-我们分成3个团队,一个团队仍使用.NET 1.1,另一个团队使用.NET 2,我所在的团队使用.NET 3.5(你可以说我们是幸运的团队!)

        10
  •  1
  •   David Brunelle    15 年前

    我们开始在新项目中使用WPF,坦率地说,很难回到WinForms。很多整洁的东西我再也不能带了。

    不过,还是有一句忠告。尽管您可以使用WPF进行更复杂的布局(如上面提到的按钮,或者几乎任何实际内容,都可以承载图像、文本框等其他内容),但在WinForm中发现的其他一些“基础”内容很难重现。 示例:在wpf工具箱出现之前,wpf没有数据报和日期时间选择器,所以您必须自己做。另外,它仍然没有masktextbox,你必须自己做或者从第三方下载它。最后一个我遇到的,我发现注释的是TreeView:树叶和父母之间的线条没有显示出来。

    尽管如此,在大多数方面仍然比WinForm好得多。

        11
  •  1
  •   tal    15 年前

    我们开始在一个新项目中使用WPF

    新的应用程序在WinForms中包含许多遗留代码。

    只要我们想使用WinForms的旧对话框,就可以了。

    当你开始使用WPF时,你真的不想回到winforms。在WinForms中,做GUI的工作要容易得多,这会占用你很多时间。

    无论如何,学习这些东西需要一些时间,并且能够使用它的所有能力(不仅是UI,还包括数据绑定和命令模式)。

    有经验的人可以帮助第一个架构是非常有帮助的。