.NET 9 Windows 窗体中的新增功能

本文介绍 .NET 9 Windows 窗体中的新增功能。

异步表单

重要

此功能集是实验性的,Control.InvokeAsync除外。

新式应用需要异步通信模型。 随着 .NET 上的Windows 窗体的发展,更多的组件需要封送到在 async UI 线程上运行的方法。 例如,WebView2、本机 Windows 10 和 Windows 11 API 等控件,或语义内核新式异步库。 另一种方案是共享基于其他 UI 堆栈(如 WPF、WinUI 或 .NET MAUI)Windows 窗体构建async的 MVVM ViewModel。

下面列出了为支持异步方案而添加的新方法:

此 API 在编译器错误后面受到保护,因为它是实验性的。 若要禁止显示错误并启用对 API 的访问,请将以下内容 PropertyGroup 添加到项目文件:

XML
<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>

提示

有关如何禁止显示此规则的详细信息,请参阅 编译器错误WFO5002

不再支持 BinaryFormatter

BinaryFormatter 被视为不安全,因为它容易受到反序列化攻击,这可能导致拒绝服务(DoS)、信息泄露或远程代码执行。 它在反序列化漏洞被充分理解之前实现,其设计不遵循现代安全最佳做法。

从 .NET 9 开始,其实现已被删除,以防止这些安全风险。 使用时 BinaryFormatterPlatformNotSupportedException 将引发异常。

Windows 窗体在许多方案中使用BinaryFormatter,例如,在序列化剪贴板和拖放操作的数据时,最重要的是Windows 窗体设计器。 在内部,Windows 窗体继续使用更安全的BinaryFormatter子集来处理具有已知类型集的特定用例。

适用于 .NET 9 的Windows 窗体随分析器一起交付,可帮助识别不知不觉参与二进制序列化的时间。

有关详细信息BinaryFormatter,请参阅 BinaryFormatter Windows 窗体 迁移指南。

深色模式

重要

此功能集是实验性的。

已将对深色模式的初步支持添加到Windows 窗体,目标是在 .NET 10 中完成支持。 当颜色模式更改时,将 SystemColors 更改颜色模式以匹配。 应用的颜色模式可以设置为以下值之一:

  • SystemColorMode.Classic- (默认值) 浅色模式,与以前版本的Windows 窗体相同。
  • SystemColorMode.System- 尊重 Windows 设置的浅色或深色模式。
  • SystemColorMode.Dark- 使用深色模式。

若要应用颜色模式,请调用 Application.SetColorMode(SystemColorMode) 程序启动代码:

C#
namespace MyExampleProject;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // To customize application configuration such as set high DPI settings or default font,
        // see https://aka.ms/applicationconfiguration.
        ApplicationConfiguration.Initialize();
        Application.SetColorMode(SystemColorMode.Dark);
        Application.Run(new Form1());
    }    
}
VB
Friend Module Program

    <STAThread()>
    Friend Sub Main(args As String())
        Application.SetHighDpiMode(HighDpiMode.SystemAware)
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.SetColorMode(SystemColorMode.Dark)
        Application.Run(New Form1)
    End Sub

End Module

此 API 在编译器错误后面受到保护,因为它是实验性的。 若要禁止显示错误并启用对 API 的访问,请将以下内容 PropertyGroup 添加到项目文件:

XML
<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>

提示

有关如何禁止显示此规则的详细信息,请参阅 编译器错误WFO5001

FolderBrowserDialog 增强功能

FolderBrowserDialog 现在支持选择存储在数组中的 SelectedPaths 多个文件夹。 若要启用多个文件夹,请设置为 Multiselecttrue.

System.Drawing 新功能和增强功能

System.Drawing 库进行了许多改进,包括包装 GDI+ 效果、支持ReadOnlySpan和更好的互操作代码生成。

System.Drawing 支持 GDI+ 效果

System.Drawing 库现在支持 GDI+ 位图效果,例如模糊和淡色。 效果是 GDI+ 的一部分,但直到现在才通过 System.Drawing 公开效果。

通过调用Bitmap该方法将效果应用于该Bitmap.ApplyEffect(Effect, Rectangle)效果。 为要应用效果的区域提供效果和可选 Rectangle 效果。 用于 Rectangle.Empty 处理整个映像。

命名空间 System.Drawing.Imaging.Effects 包含可应用的效果:

System.Drawing 支持 Span

已增强接受数组的许多方法也接受 ReadOnlySpan。 例如,方法(例如 GraphicsPath.AddLines(ReadOnlySpan<Point>)Graphics.DrawLines(Pen, ReadOnlySpan<Point>)DrawPolygon(Pen, ReadOnlySpan<Point>))接受数组或 ReadOnlySpan

使用 CsWin32 进行互操作

所有互操作代码已替换为 C# P/Invoke 源生成器 CsWin32

ToolStrip

以下改进已添加到 ToolStrip 控件中 ToolStripItem

  • 已向 ToolStrip<a0/a0> 添加了一个新属性。

    设置为 “ true设置为”时,控件可以在窗体未对焦时与控件交互。

在发布 .NET Core 3.1 时, Menu删除了所有相关控件,例如 MainMenuMenuItem/ ToolStripToolStripMenuItem 改为使用。 但是,ToolStripItem基类没有替代事件的ToolStripMenuItem基类MenuItem.Select。 当鼠标或键盘用于突出显示项时,将引发此事件。

.NET 9 已添加 ToolStripItem.SelectedChanged,可用于检测何时突出显示菜单项。