Поделиться через


Новые возможности Windows Forms для .NET 9

В этой статье описаны новые возможности Windows Forms для .NET 9.

Асинхронные формы

Внимание

Этот набор функций является экспериментальным.

Для современных приложений требуются асинхронные модели взаимодействия. По мере роста Windows Forms в .NET больше компонентов требуют маршалинга async в метод для запуска в потоке пользовательского интерфейса. Например, элементы управления, такие как WebView2, собственные API Windows 10 и Windows 11, или современные асинхронные библиотеки, такие как семантический ядро. Другим сценарием будет общий доступ к MVVM ViewModels, созданным async с помощью Windows Forms из других стеков пользовательского интерфейса, таких как WPF, WinUI или .NET MAUI.

Ниже приведен список новых методов, добавленных для поддержки асинхронных сценариев:

Этот API охраняется ошибкой компилятора, так как она экспериментальна. Чтобы отключить ошибку и включить доступ к API, добавьте следующее PropertyGroup в файл проекта:

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

Совет

Дополнительные сведения о подавлении этого правила см. в разделе "Ошибка компилятора" WFO5002.

BinaryFormatter больше не поддерживается

BinaryFormatter считается небезопасным, поскольку он уязвим для атак десериализации, что может привести к отказу в обслуживании (DoS), раскрытию информации или удаленному выполнению кода. Она была реализована до того, как уязвимости десериализации были хорошо поняты, и его дизайн не соответствует современным рекомендациям по обеспечению безопасности.

Начиная с .NET 9, его реализация была удалена, чтобы предотвратить эти риски безопасности. При BinaryFormatter использовании PlatformNotSupportedException создается исключение.

Windows Forms используется BinaryFormatter во многих сценариях, таких как сериализация данных для операций буфера обмена и перетаскивания, а также, в частности, конструктор Windows Forms. Внутри системы Windows Forms продолжает использовать более безопасное подмножество BinaryFormatter для обработки конкретных вариантов использования с известным набором типов.

Windows Forms для .NET 9 предоставляет анализаторы, которые помогают определить время, когда вы не знаете, участвуете в двоичной сериализации.

Дополнительные сведения см. в руководстве по BinaryFormatterмиграции Windows Forms для BinaryFormatter.

Темный режим

Внимание

Этот набор функций является экспериментальным.

Предварительная поддержка темного режима добавлена в Windows Forms с целью завершения поддержки в .NET 10. При изменении SystemColors цветового режима изменится соответствие. В цветовом режиме приложения можно задать одно из следующих значений:

  • SystemColorMode.Classic— (по умолчанию) Режим освещения, аналогичный предыдущим версиям Windows Forms.
  • SystemColorMode.System— Соблюдайте светлый или темный режим, заданный Windows.
  • SystemColorMode.Dark— Используйте темный режим.

Чтобы применить цветовой режим, вызовите Application.SetColorMode(SystemColorMode) код запуска программы:

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());
    }    
}
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 в файл проекта:

<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 поддерживает диапазон

Многие методы, принимаюющие массивы, также были улучшены для принятия ReadOnlySpan. Например, такие методы, как GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>)и DrawPolygon(Pen, ReadOnlySpan<Point>)прием массива или ReadOnlySpan.

Использование CsWin32 для взаимодействия

Весь код взаимодействия заменен CsWin32— генератором исходного источника C# P/Invoke.

ToolStrip

Следующие улучшения добавлены в ToolStrip элементы управления и ToolStripItem элементы управления.

  • Новое свойство было добавлено в ToolStrip, AllowClickThrough.

    Если задано значение true, элемент управления можно взаимодействовать с тем, как форма не сфокусирована.

После выпуска .NET Core 3.1 все Menuсвязанные элементы управления, такие как MainMenu и MenuItem, были удалены. ToolStrip вместо ToolStripMenuItem этого следует использовать. Тем не менее, ToolStripItemбазовый класс для ToolStripMenuItem, не имеет замены для MenuItem.Select события. Это событие возникает при использовании мыши или клавиатуры для выделения элемента.

Добавлен ToolStripItem.SelectedChanged.NET 9, который можно использовать для обнаружения выделения элемента меню.