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


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

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

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

Это важно

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

Для современных приложений требуются асинхронные модели взаимодействия. По мере роста 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 используется во многих сценариях, например, при сериализации данных для операций с буфером обмена и перетаскиванием, и, что наиболее важно, в конструкторе 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 . Чтобы включить несколько папок, установите Multiselect в true.

Новые функции и усовершенствования в 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 элементы управления и ToolStripItem элементы управления.

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

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

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

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