.NET 6(Windows 窗体 .NET)的新增功能
本文介绍 .NET 6 中一些新的 Windows 窗体功能和增强功能。
从 .NET Framework 迁移到 .NET 6 时,应注意一些重大更改。 有关详细信息,请参阅 Windows 窗体中的重大更改。
更新了用于 C# 的模板
.NET 6 引入了许多针对标准控制台应用程序模板的更改。 根据这些更改,用于 C# 的 Windows 窗体模板已更新为默认支持 global using
指令、文件范围的命名空间和可以为 null 的引用类型。
Windows 窗体未沿用的新 C# 模板的一项功能是顶级语句。 典型的 Windows 窗体应用程序需要 [STAThread]
属性,并且由拆分成多个文件(例如设计器代码文件)的多种类型组成,因此,使用顶级语句没有意义。
新应用程序启动
生成新 Windows 窗体应用程序的模板会创建一个 Main
方法,该方法在你的应用程序运行时用作应用程序的入口点。 此方法包含配置 Windows 窗体并显示第一个窗体的代码,称为启动代码:
class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
在 .NET 6 中,这些模板已修改为使用 ApplicationConfiguration.Initialize
方法调用的新启动代码。
class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
此方法在编译时自动生成,并包含用于配置 Windows 窗体的代码。 项目文件现在也可以控制这些设置,使你可以避免在代码中对它进行配置。 例如,生成的方法类似于以下代码:
public static void Initialize()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetHighDpiMode(HighDpiMode.SystemAware);
}
Visual Studio 使用新的启动代码来配置 Windows 窗体可视化设计器。 如果通过恢复旧代码以及通过绕过 ApplicationConfiguration.Initialize
方法来选择不使用新的启动代码,Windows 窗体可视化设计器将不会遵循你所设置的启动设置。
Initialize
方法中生成的设置由项目文件控制。
项目级应用程序设置
为补充 Windows 窗体的新应用程序启动功能,应在项目文件中设置以前在应用程序的启动代码中设置的一些 Application
设置。 项目文件可以配置以下应用程序设置:
项目设置 | 默认值 | 相应的 API |
---|---|---|
ApplicationVisualStyles | true |
Application.EnableVisualStyles |
ApplicationUseCompatibleTextRendering | false |
Application.SetCompatibleTextRenderingDefault |
ApplicationHighDpiMode | SystemAware |
Application.SetHighDpiMode |
ApplicationDefaultFont | Segoe UI, 9pt |
Application.SetDefaultFont |
以下示例展示了设置这些应用程序相关属性的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<ApplicationVisualStyles>true</ApplicationVisualStyles>
<ApplicationUseCompatibleTextRendering>false</ApplicationUseCompatibleTextRendering>
<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
<ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
</PropertyGroup>
</Project>
Windows 窗体可视化设计器会使用这些设置。 有关详细信息,请参阅 Visual Studio 设计器改进部分。
更改默认字体
.NET Core 3.0 上的 Windows 窗体引入了新的 Windows 窗体默认字体:“Segoe UI, 9pt”。 此字体更符合 Windows 用户体验 (UX) 指南。 但是,.NET Framework 使用“Microsoft Sans Serif, 8.25pt”作为默认字体。 这一变化使一些客户更难以将他们采用像素完美的布局的大型应用程序从 .NET Framework 迁移到 .NET。 之前更改整个应用程序的字体的唯一方法是编辑项目中的每个窗体,通过将 Font 属性设置为替代字体来实现。
现在,可以通过两种方式来设置默认字体:
设置应用程序启动代码要使用的项目文件中的默认字体:
重要
这是首选方法。 通过使用项目来配置新应用程序启动系统,使 Visual Studio 可以在设计器中使用这些设置。
在以下示例中,项目文件将 Windows 窗体配置为使用 .NET Framework 所用的相同字体。
<Project Sdk="Microsoft.NET.Sdk"> <!-- other settings --> <PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup> </Project>
- 或 -
以旧方式调用 Application.SetDefaultFont API(但没有设计器支持):
class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f)); Application.Run(new Form1()); } }
Visual Studio 设计器改进
Windows 窗体可视化设计器现在可以准确地反映默认字体。 适用于 .NET 的 Windows 窗体的早期版本没有在可视化设计器中正确显示 Segoe UI 字体,实际上使用的是 .NET Framework 的默认字体来设计窗体。 由于新的新应用程序启动功能,可视化设计器可准确地反映默认字体。 此外,可视化设计器还遵循在项目文件中设置的默认字体。
更多的运行时设计器
存在于 .NET Framework 中并且能够生成通用设计器(例如生成报表设计器)的设计器已添加到 .NET 6:
- System.ComponentModel.Design.ComponentDesigner
- System.Windows.Forms.Design.ButtonBaseDesigner
- System.Windows.Forms.Design.ComboBoxDesigner
- System.Windows.Forms.Design.ControlDesigner
- System.Windows.Forms.Design.DocumentDesigner
- System.Windows.Forms.Design.DocumentDesigner
- System.Windows.Forms.Design.FormDocumentDesigner
- System.Windows.Forms.Design.GroupBoxDesigner
- System.Windows.Forms.Design.LabelDesigner
- System.Windows.Forms.Design.ListBoxDesigner
- System.Windows.Forms.Design.ListViewDesigner
- System.Windows.Forms.Design.MaskedTextBoxDesigner
- System.Windows.Forms.Design.PanelDesigner
- System.Windows.Forms.Design.ParentControlDesigner
- System.Windows.Forms.Design.ParentControlDesigner
- System.Windows.Forms.Design.PictureBoxDesigner
- System.Windows.Forms.Design.RadioButtonDesigner
- System.Windows.Forms.Design.RichTextBoxDesigner
- System.Windows.Forms.Design.ScrollableControlDesigner
- System.Windows.Forms.Design.ScrollableControlDesigner
- System.Windows.Forms.Design.TextBoxBaseDesigner
- System.Windows.Forms.Design.TextBoxDesigner
- System.Windows.Forms.Design.ToolStripDesigner
- System.Windows.Forms.Design.ToolStripDropDownDesigner
- System.Windows.Forms.Design.ToolStripItemDesigner
- System.Windows.Forms.Design.ToolStripMenuItemDesigner
- System.Windows.Forms.Design.TreeViewDesigner
- System.Windows.Forms.Design.UpDownBaseDesigner
- System.Windows.Forms.Design.UserControlDocumentDesigner
针对 PerMonitorV2 的高 DPI 改进
改进了 PerMonitorV2 的高 DPI 呈现:
控件是使用与应用程序相同的 DPI 感知创建的。
容器控件和 MDI 子窗口改进了缩放行为。
例如,在 .NET 5 中,将 Windows 窗体应用从缩放比例为 200% 的监视器移动到缩放比例为 100% 的监视器会导致控件错位。 .NET 6 中已大幅改进了这一点:
新 API
- System.Windows.Forms.Application.SetDefaultFont
- System.Windows.Forms.Control.IsAncestorSiteInDesignMode
- System.Windows.Forms.ProfessionalColors.StatusStripBorder
- System.Windows.Forms.ProfessionalColorTable.StatusStripBorder
新 Visual Basic API
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventHandler
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs.MinimumSplashScreenDisplayTime
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs.MinimumSplashScreenDisplayTime
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs.Font
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs.Font
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs.HighDpiMode
- Microsoft.VisualBasic.ApplicationServices.ApplyApplicationDefaultsEventArgs.HighDpiMode
- Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.ApplyApplicationDefaults
- Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.HighDpiMode
- Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.HighDpiMode
已更新的 API
System.Windows.Forms.Control.Invoke 现在接受 System.Action 和 System.Func<TResult> 作为输入参数。
System.Windows.Forms.Control.BeginInvoke 现在接受 System.Action 作为输入参数。
使用以下成员扩展了 System.Windows.Forms.DialogResult:
TryAgain
Continue
System.Windows.Forms.Form 新增了一个属性:MdiChildrenMinimizedAnchorBottom
使用以下成员扩展了 System.Windows.Forms.MessageBoxButtons:
CancelTryContinue
使用以下成员扩展了 System.Windows.Forms.MessageBoxDefaultButton:
Button4
System.Windows.Forms.LinkClickedEventArgs 现在新增了一个构造函数,并使用以下属性进行了扩展:
System.Windows.Forms.NotifyIcon.Text 现在限制为 127 个字符(原来为 63 个字符)。
改进了 辅助功能
Microsoft UI 自动化模式可更好地与讲述人和 Jaws 等辅助工具协同工作。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈