.NET 5重大变更之WPF和Windows Forms

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":".NET 5重大变更系列的最后一个主题是WPF和Windows Forms。这些桌面技术在.NET Core 3.0之前是不可用的,因为.NET Core的早期版本主要专注于基于Web的应用程序(ASP.NET Core)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2002年.NET首次发布时,"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Windows_Forms","title":null,"type":null},"content":[{"type":"text","text":"Windows Forms"}]},{"type":"text","text":"(非正式地被称为WinForms)是最早的应用程序框架之一。(其他框架包括WebForms、Console和Windows Services。)WinForms深受Visual Basic的影响,和VB一样,它对原生Windows控件进行了一层薄薄的包装。默认情况下,这提供了非常好的性能,但定制能力相当有限。一般来说,开发人员应该允许操作系统处理样式等方面的东西。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"WinForms的第一个主要变化是在2005年发布的.NET 2.0中出现的,引入了微软认为低效的各种用户控件的替代品,包括基本的数据网格。从那时起,这项技术就被认为是“完整的”,唯一的变化是偶尔更新一下,以便支持更高的DPI。即使是长期存在的bug通常也会被忽略,这让使用WinForms进行新项目开发的开发人员感到非常恼火。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Windows_Presentation_Foundation","title":null,"type":null},"content":[{"type":"text","text":"Windows Presentation Foundation"}]},{"type":"text","text":" (WPF)是微软首次尝试创建的一个完全可定制的GUI框架。虽然只比WinForms晚发布了四年,但它还是花了很长一段时间才被普遍接受,因为它的设计模式和概念更为复杂,性能也可能是一个问题。虽然有些技术(如虚拟化)可以使WPF在大型数据集上比WinForms快得多,但需要更深入的知识才能正确使用它们。此外,很多开发人员认为定制样式是必需的,因为默认样式很“丑”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"WPF有两个影响深远的关键“特性”,一个是使用XAML进行UI布局,另一个是使用MVVM模式进行数据绑定。这些也被引入到其他项目中,比如Silverlight和Universal Windows Platform。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"像WinForms一样,WPF多年来也一直被认为是“完整的”。它甚至不支持"},{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2009\/12\/XAML-2009-Future\/","title":null,"type":null},"content":[{"type":"text","text":"XAML-2009"}]},{"type":"text","text":",即使是在2012年"},{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2012\/02\/Xaml-VBA-Specs\/?itm_source=presentations_about_XAML-2009&itm_medium=link&itm_campaign=XAML-2009","title":null,"type":null},"content":[{"type":"text","text":"XAML规范"}]},{"type":"text","text":"发布之后。作为回应,"},{"type":"link","attrs":{"href":"http:\/\/avaloniaui.net\/","title":null,"type":null},"content":[{"type":"text","text":"Avalonia"}]},{"type":"text","text":"等项目试图改进WPF的缺陷,比如允许将事件直接绑定到模型或视图模型。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"新的SDK"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在.NET Core 3.x中,WPF和WinForms需要一个叫作Microsoft.NET.Sdk.WindowsDesktop的自定义SDK。在.NET 5中,使用的是Microsoft.NET.Sdk,就像其他.NET 5项目一样。但现在的目标框架是net5.0-windows,而不是net5.0。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"隐藏控制台输出"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"绝大多数WPF和WinForms应用程序不显示控制台窗口,这是默认的选项。如果你需要一个地方来显示额外的诊断信息,可以将OutputType设置为Exe而不是WinExe。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在.NET 5中,除非你将DisableWinExeOutputInference设置为true,否则OutputType设置将被忽略。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"错误处理的改进"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"错误处理的改进也可能是个重大变更。在.NET Core 3的Windows Forms中,很多验证代码根本不存在。这意味着如果你传入一个无效的参数,它可能会抛出一个NullReferenceException或者表现出一种不确定的行为。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在.NET 5中,它会抛出相应的ArgumentException、ArgumentNullException或ArgumentOutOfRangeException。如果是属性为空,而不是参数为空,那么将抛出InvalidOperationException。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有关如何正确使用异常,请参见"},{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/articles\/Exceptions-API-Design\/","title":null,"type":null},"content":[{"type":"text","text":".NET中的异常设计"}]},{"type":"text","text":"。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"移除状态栏控件"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我们在上面讨论WinForms的历史,是为了解释状态栏控件都发生了什么。在.NET Framework 2中被替换的一个控件是不起眼的"},{"type":"link","attrs":{"href":"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.windows.forms.statusbar?view=netcore-3.1","title":null,"type":null},"content":[{"type":"text","text":"StatusBar"}]},{"type":"text","text":"。在.NET 2中是"},{"type":"link","attrs":{"href":"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.windows.forms.statusstrip?view=net-5.0","title":null,"type":null},"content":[{"type":"text","text":"StatusStrip"}]},{"type":"text","text":",它们的作用是一样的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"微软没有解释为什么要移除它,所以对于一个大多数人都不知道的控制,其维护成本太高了。StatusBar在设计器工具箱中已经很久不可见了,在.NET 5中已经被移除了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本系列其他文章"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2020\/12\/net-5-breaking-changes","title":null,"type":null},"content":[{"type":"text","text":".NET 5基类库的重大变更"}]},{"type":"text","text":";"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2020\/12\/net-5-breaking-changes-2","title":null,"type":null},"content":[{"type":"text","text":".NET 5重大变化:历史性的技术"}]},{"type":"text","text":";"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2020\/12\/net-5-breaking-changes-aspnet","title":null,"type":null},"content":[{"type":"text","text":".NET 5 ASP.NET Core重大变更"}]},{"type":"text","text":"。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文链接"},{"type":"text","text":":"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2020\/12\/net-5-breaking-changes-windows\/","title":null,"type":null},"content":[{"type":"text","text":".NET 5 Breaking Changes for WPF\/Windows Forms"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章