Novidades no Windows Forms para .NET 9
Este artigo descreve o que há de novo no Windows Forms para .NET 9.
Formulários assíncronos
Importante
Este conjunto de recursos é experimental.
Aplicativos modernos exigem modelos de comunicação assíncrona. À medida que o Windows Forms cresceu no .NET, mais componentes exigem marshaling para um async
método a ser executado no thread da interface do usuário. Por exemplo, controles como WebView2, APIs nativas do Windows 10 e Windows 11 ou bibliotecas assíncronas modernas, como Kernel Semântico. Outro cenário seria quando você está compartilhando ViewModels MVVM criados async
com Windows Forms de outras pilhas de interface do usuário, como WPF, WinUI ou .NET MAUI.
Veja a seguir uma lista de novos métodos adicionados para dar suporte a cenários assíncronos:
- System.Windows.Forms.Form.ShowAsync
- Form.ShowDialogAsync
- TaskDialog.ShowDialogAsync
- Control.InvokeAsync (Essa API não é experimental.)
Essa API é protegida por um erro do compilador porque é experimental. Para suprimir o erro e habilitar o acesso à API, adicione o seguinte PropertyGroup
ao arquivo de projeto:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>
Dica
Para obter mais informações sobre como suprimir essa regra, consulte Erro do compilador WFO5002.
BinaryFormatter não é mais suportado
BinaryFormatter
é considerado inseguro porque é vulnerável a ataques de desserialização, que podem levar à negação de serviço (DoS), divulgação de informações ou execução remota de código. Ele foi implementado antes que as vulnerabilidades de desserialização fossem bem compreendidas e seu design não segue as melhores práticas de segurança modernas.
A partir do .NET 9, sua implementação foi removida para evitar esses riscos de segurança. Quando BinaryFormatter
é usado, a PlatformNotSupportedException
exceção é lançada.
Windows Forms usado BinaryFormatter
em muitos cenários, como ao serializar dados para operações de área de transferência e arrastar e soltar e, o mais importante, o Windows Forms Designer. Internamente, o Windows Forms continua a usar um subconjunto mais seguro para BinaryFormatter
lidar com casos de uso específicos com um conjunto conhecido de tipos.
O Windows Forms para .NET 9 é fornecido com analisadores que ajudam a identificar os momentos em que você participa inadvertidamente da serialização binária.
Para obter mais informações sobre BinaryFormatter
o , consulte Guia de migração do Windows Forms para BinaryFormatter.
Modo escuro
Importante
Este conjunto de recursos é experimental.
O suporte preliminar para o modo escuro foi adicionado ao Windows Forms, com o objetivo de finalizar o suporte no .NET 10. Quando o modo de cor muda, eles SystemColors são alterados para corresponder. O modo de cor do aplicativo pode ser definido como um dos seguintes valores:
SystemColorMode.Classic
—(padrão) Modo claro, o mesmo que as versões anteriores do Windows Forms.SystemColorMode.System
—Respeite o modo claro ou escuro definido pelo Windows.SystemColorMode.Dark
—Use o modo escuro.
Para aplicar um modo de cor, chame Application.SetColorMode(SystemColorMode) o código de inicialização do programa:
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
Essa API é protegida por um erro do compilador porque é experimental. Para suprimir o erro e habilitar o acesso à API, adicione o seguinte PropertyGroup
ao arquivo de projeto:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>
Dica
Para obter mais informações sobre como suprimir essa regra, consulte Erro do compilador WFO5001.
Aprimoramentos de FolderBrowserDialog
FolderBrowserDialog
agora suporta a seleção de várias pastas, que são armazenadas na SelectedPaths matriz. Para ativar várias pastas, defina Multiselect como true
.
System.Drawing novos recursos e aprimoramentos
A biblioteca System.Drawing teve muitas melhorias, incluindo o encapsulamento de efeitos GDI+, suporte para ReadOnlySpan
e melhor geração de código de interoperabilidade.
System.Drawing dá suporte a efeitos GDI+
A biblioteca System.Drawing agora dá suporte a efeitos de bitmap GDI+, como desfoque e tonalidade. Os efeitos fazem parte do GDI+, mas não foram expostos por meio de System.Drawing até agora.
Os efeitos são aplicados a um Bitmap chamando o Bitmap.ApplyEffect(Effect, Rectangle) método. Forneça o efeito e um opcional Rectangle
para a área em que aplicar o efeito. Use Rectangle.Empty para processar a imagem inteira.
O System.Drawing.Imaging.Effects namespace contém os efeitos que você pode aplicar:
- BlackSaturationCurveEffect
- BlurEffect
- BrightnessContrastEffect
- ColorBalanceEffect
- ColorCurveEffect
- ColorLookupTableEffect
- ColorMatrixEffect
- ContrastCurveEffect
- CurveChannel
- DensityCurveEffect
- ExposureCurveEffect
- GrayScaleEffect
- HighlightCurveEffect
- InvertEffect
- LevelsEffect
- MidtoneCurveEffect
- ShadowCurveEffect
- SharpenEffect
- TintEffect
- VividEffect
- WhiteSaturationCurveEffect
System.Drawing dá suporte a Span
Muitos métodos que aceitavam arrays foram aprimorados para aceitar ReadOnlySpan
também . Por exemplo, métodos como GraphicsPath.AddLines(ReadOnlySpan<Point>), , e Graphics.DrawLines(Pen, ReadOnlySpan<Point>), aceitam uma matriz ou DrawPolygon(Pen, ReadOnlySpan<Point>)ReadOnlySpan
.
Usar o CsWin32 para interoperabilidade
Todo o código de interoperabilidade foi substituído pelo CsWin32, um gerador de origem C# P/Invoke.
ToolStrip
As melhorias a seguir foram adicionadas aos ToolStrip controles e ToolStripItem .
Uma nova propriedade foi adicionada a
ToolStrip
, AllowClickThrough.Quando definido como
true
, o controle pode ser interagido enquanto o formulário está desfocado.
Quando o .NET Core 3.1 foi lançado, todos os Menu
controles relacionados, como MainMenu
e MenuItem
, foram removidos. ToolStrip
e ToolStripMenuItem
deve ser usado em vez disso. No entanto, ToolStripItem
, a classe base para ToolStripMenuItem
, não tinha um substituto para o MenuItem.Select
evento. Esse evento foi gerado quando o mouse ou teclado é usado para realçar o item.
O .NET 9 adicionou ToolStripItem.SelectedChanged, que pode ser usado para detectar quando um item de menu é realçado.
.NET Desktop feedback