Новые возможности 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.
Ниже приведен список новых методов, добавленных для поддержки асинхронных сценариев:
- System.Windows.Forms.Form.ShowAsync
- Form.ShowDialogAsync
- TaskDialog.ShowDialogAsync
- Control.InvokeAsync (Этот API не является экспериментальным.)
Этот 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 имен содержит эффекты, которые можно применить:
- BlackSaturationCurveEffect
- BlurEffect
- BrightnessContrastEffect
- ColorBalanceEffect
- ColorCurveEffect
- ColorLookupTableEffect
- ColorMatrixEffect
- ContrastCurveEffect
- CurveChannel
- DensityCurveEffect
- ExposureCurveEffect
- GrayScaleEffect
- HighlightCurveEffect
- InvertEffect
- LevelsEffect
- MidtoneCurveEffect
- ShadowCurveEffect
- SharpenEffect
- TintEffect
- VividEffect
- WhiteSaturationCurveEffect
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, который можно использовать для обнаружения выделения элемента меню.
.NET Desktop feedback