WinForms no .NET 11: novidades do RC 2 e como usar

O WinForms no .NET 11 recebe a maior renovação visual da sua história recente, e o RC 2 consolida essas mudanças antes da versão final. Neste artigo, vamos explorar cada nova API, entender as decisões de compatibilidade e ver como aplicar tudo isso em projetos reais.
Além do novo renderizador, a versão traz analyzers que guiam o Designer, um componente para modo quiosque e uma forma mais segura de suspender pintura e layout.
O que muda no WinForms no .NET 11
Durante as previews, a equipe do WinForms no .NET 11 introduziu um pipeline de renderização moderno, integração com configurações de acessibilidade do Windows e melhorias de desempenho em operações em lote. O RC 2 refina esse trabalho e corrige o uso recomendado de várias APIs.
Na prática, as notas do RC 2 também consolidam tudo o que apareceu no resumo oficial do RC 1 no Microsoft Learn. Por isso, este é o melhor momento para estudar o conjunto completo antes do lançamento.
Salvo indicação contrária, todas as APIs funcionam tanto em C# quanto em Visual Basic. Assim, quem mantém aplicações antigas em VB também ganha acesso às mesmas melhorias.
Visual styles no WinForms no .NET 11
O coração da atualização está no enum VisualStylesMode. Com ele, você escolhe qual versão do renderizador a aplicação inteira ou um controle específico vai usar.
O método Application.SetDefaultVisualStylesMode define o padrão global, enquanto a propriedade Control.VisualStylesMode permite sobrescrever o modo em um controle isolado. Já Application.DefaultVisualStylesMode informa qual padrão está ativo.
Os cinco modos de VisualStylesMode
Cada modo tem um papel bem definido, e entender a diferença entre eles evita surpresas.
| Modo | Comportamento |
|---|---|
Inherit |
Remove a sobrescrita local e herda o modo do controle pai. Não vale como padrão da aplicação. |
Classic |
Usa o renderizador tradicional, baseado na versão 6 da biblioteca common controls. |
Disabled |
Desliga os visual styles e usa o comportamento antigo dos common controls. |
Net11 |
Ativa as melhorias de renderização e layout que cada controle suporta. |
Latest |
Seleciona o renderizador estável mais recente do framework em execução. |
Repare que, no WinForms no .NET 11, Classic não significa visual styles desligados. Na verdade, quem desliga tudo é o modo Disabled.
Comportamento ambiente e herança
A propriedade VisualStylesMode funciona como uma propriedade ambiente, porque os controles filhos começam em Inherit e herdam o valor do pai. Dessa forma, a configuração desce por toda a árvore de controles.
No entanto, existe uma diferença importante em relação a Font ou BackColor. O getter devolve o valor solicitado, inclusive Inherit, e não o renderizador resolvido.
Além disso, um valor explícito continua como sobrescrita local mesmo quando coincide com o do pai. Somente a atribuição de Inherit remove essa sobrescrita.
Outro ponto merece atenção: modo escuro e versão do renderizador são escolhas independentes. Ativar o dark mode não coloca a aplicação automaticamente no modo Net11.
Configurando o renderizador na inicialização
Chame SetDefaultVisualStylesMode durante a inicialização, antes de criar qualquer janela. Esse método não ativa os visual styles sozinho, então mantenha a chamada a ApplicationConfiguration.Initialize().
O padrão da aplicação só pode ser escolhido uma vez. Repetir o mesmo valor funciona, mas trocar para outro valor lança InvalidOperationException.
using System.Windows.Forms;
ApplicationConfiguration.Initialize();
// Define o renderizador moderno para toda a aplicação
Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);
Form form = new() { Text = "Modern visual styles" };
// Este botão mantém o visual clássico
Button classicButton = new()
{
Text = "Keep classic rendering",
VisualStylesMode = VisualStylesMode.Classic,
AutoSize = true,
Dock = DockStyle.Top
};
form.Controls.Add(classicButton);
Application.Run(form);
Para quem cria controles customizados, a propriedade protegida EffectiveVisualStylesMode entrega o modo final, já considerando herança e acessibilidade. Contudo, não guarde esse valor em cache, pois o alto contraste do Windows pode mudar com a aplicação aberta.
Mudanças de compatibilidade do RC 2
O RC 2 do WinForms no .NET 11 tomou algumas decisões conservadoras para evitar regressões visuais. Esses ajustes afetam controles compostos que ainda não terminaram a modernização.
ToolStrip, DataGridView e PropertyGrid
ToolStrip, MenuStrip e DataGridView usam renderização clássica por padrão, mesmo quando você pede o modo Net11. Com isso, a equipe evita problemas de recorte, altura de linha, padding e bordas.
Caso você queira testar os renderizadores modernos desses controles, ative os switches do AppContext antes de criá-los.
// Reativa a renderização moderna experimental dos controles compostos
AppContext.SetSwitch("System.Windows.Forms.ToolStripModernRendering", true);
AppContext.SetSwitch("System.Windows.Forms.DataGridViewModernRendering", true);
Esses switches apenas removem o fallback clássico. Portanto, eles não ativam visual styles nem selecionam Net11 por conta própria.
O PropertyGrid também permanece no modo clássico, assim como seus editores hospedados. A sobrescrita de VisualStylesMode nesse controle sempre devolve Classic e guarda a atribuição apenas para uso futuro.
Bordas por estado nos controles de texto
TextBox, MaskedTextBox e RichTextBox ganham bordas específicas para os estados de repouso, hover, foco, desabilitado e somente leitura. Além disso, uma borda inferior mais forte cria sensação de elevação, e o foco usa a cor de destaque do Windows.
As cores dessas bordas não dependem mais de ForeColor. Assim, mudar a cor do texto não altera o contorno do campo.
Layout no WinForms no .NET 11
O novo visual muda tamanhos preferidos, padding e métricas dos controles. Por isso, as notas oficiais afirmam com todas as letras que o modo Net11 vai quebrar layouts posicionados pixel a pixel.
Na prática, a recomendação para o WinForms no .NET 11 é trocar posicionamento absoluto por TableLayoutPanel e FlowLayoutPanel. Esses contêineres se adaptam automaticamente quando as métricas mudam.
A equipe sugere inclusive usar o GitHub Copilot ou outras ferramentas de IA para refatorar formulários antigos. Também existem skills de WinForms em preview, que ainda estão em desenvolvimento ativo.
Outra novidade envolve o Padding em controles derivados de TextBoxBase. Agora a propriedade aparece na janela Properties, entra no código gerado pelo Designer e afeta o texto quando o modo efetivo é Net11 ou superior.
Essa mudança não quebra compatibilidade binária, porque a propriedade já existia. Contudo, ela continua sem efeito nos modos Classic e Disabled.
Toggle switch no WinForms no .NET 11
Entre as novidades visuais do WinForms no .NET 11, o valor Appearance.ToggleSwitch transforma um CheckBox de dois estados ou um RadioButton em um interruptor moderno. Isso não cria um controle novo, então Checked, CheckedChanged e o data binding continuam iguais.
CheckBox notificationsToggle = new()
{
Text = "Enable notifications",
Appearance = Appearance.ToggleSwitch,
VisualStylesMode = VisualStylesMode.Net11,
AutoSize = true,
Checked = true
};
O renderizador do toggle tem prioridade sobre FlatStyle.System. Porém, um CheckBox com ThreeState ativo mantém o comportamento clássico.
Os modos Classic, Disabled e o alto contraste também ignoram a aparência moderna. Além disso, o RC 2 corrige rótulos longos em idiomas da direita para a esquerda, que antes sobrepunham o interruptor.
Reagindo às configurações visuais do Windows
No WinForms no .NET 11, a propriedade Application.SystemVisualSettings devolve um retrato imutável das preferências de personalização e acessibilidade do usuário. Entre elas estão a cor de destaque, a escala de texto, o alto contraste, as animações, os indicadores de teclado e as métricas da borda de foco.
A escala de texto, por exemplo, vai de 1.0 até 2.25 e não depende do DPI do monitor. Por isso, a aplicação precisa respeitar essas preferências em vez de sobrescrevê-las.
Dentro de um formulário, prefira o evento de instância SystemVisualSettingsChanged em vez do evento estático da classe Application. O evento de instância acompanha o ciclo de vida do controle e dispensa o cancelamento da inscrição.
using System.Windows.Forms;
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
SystemVisualSettingsChanged += HandleSystemVisualSettingsChanged;
}
private void HandleSystemVisualSettingsChanged(
object? sender, SystemVisualSettingsChangedEventArgs e)
{
// Só reage quando a cor de destaque mudou
if ((e.Changed & SystemVisualSettingsCategories.AccentColor) == 0)
{
return;
}
Text = $"Accent changed: {e.OldSettings.AccentColor} -> {e.NewSettings.AccentColor}";
Invalidate();
}
}
A propriedade Changed usa flags, então várias categorias podem mudar em uma única transição. Dessa forma, você testa apenas a flag relevante antes de reconstruir recursos.
O evento estático continua útil para serviços de longa duração, como motores de tema. Contudo, consumidores de vida curta precisam cancelar a inscrição para evitar vazamentos de memória.
Deferred form reveal
O enum FormRevealMode do WinForms no .NET 11 controla a primeira apresentação de um formulário de nível superior. O objetivo é reduzir aquele flash de fundo padrão que aparece antes do tema carregar.
Com o padrão da aplicação em Inherit, o modo escuro usa apresentação adiada, enquanto o modo claro não usa. Caso queira o mesmo comportamento nos dois temas, escolha Deferred ou Classic explicitamente.
ApplicationConfiguration.Initialize();
// Adia a primeira apresentação em modo claro e escuro
Application.SetDefaultFormRevealMode(FormRevealMode.Deferred);
Form mainForm = new() { Text = "Deferred in light and dark mode" };
Application.Run(mainForm);
Diferente do setter de visual styles, SetDefaultFormRevealMode aceita várias chamadas. Além disso, a propriedade Application.IsFormRevealDeferred informa o valor booleano já resolvido.
Uma splash screen que precisa aparecer imediatamente pode usar Classic sem alterar o padrão global. Vale lembrar também que o recurso não vale para janelas filhas MDI.
Visual Basic Application Framework
Quem usa o Application Framework do Visual Basic também ganha acesso às duas configurações de inicialização do WinForms no .NET 11. As propriedades VisualStylesMode e FormRevealMode aparecem em ApplyApplicationDefaultsEventArgs e na classe WindowsFormsApplicationBase.
Imports Microsoft.VisualBasic.ApplicationServices
Imports System.Windows.Forms
Namespace My
Partial Friend Class MyApplication
Private Sub ApplyDefaults(
sender As Object, e As ApplyApplicationDefaultsEventArgs
) Handles Me.ApplyApplicationDefaults
e.VisualStylesMode = System.Windows.Forms.VisualStylesMode.Net11
e.FormRevealMode = System.Windows.Forms.FormRevealMode.Inherit
End Sub
End Class
End Namespace
Por compatibilidade, o framework do VB começa as duas configurações em Classic. Então, para ter a apresentação adiada automática no modo escuro, defina FormRevealMode.Inherit explicitamente.
SuspendPainting em atualizações em lote
Outra novidade do WinForms no .NET 11 envolve desempenho em atualizações grandes.
As extensões ControlMutationExtensions.SuspendPainting devolvem um escopo IDisposable que suspende a pintura e, opcionalmente, o layout. Quando o escopo termina, o Dispose() retoma tudo automaticamente, mesmo diante de uma exceção.
O enum LayoutSuspendTraversal define o alcance da suspensão de layout. O valor None mantém o layout ativo, TargetOnly afeta só o alvo e TargetAndDescendants percorre toda a subárvore.
using System.Drawing;
using System.Windows.Forms;
static void UpdateContainer(Control container, Font newFont)
{
// Abra o escopo antes de alterar propriedades que disparam layout
using (container.SuspendPainting(LayoutSuspendTraversal.TargetAndDescendants))
{
container.Font = newFont;
foreach (Control child in container.Controls)
{
child.Margin = new Padding(8);
}
}
}
Abra o escopo antes de mudar propriedades como Font, porque essa mudança se propaga aos filhos e dispara layout repetido. Assim, o trabalho acontece em lote, inclusive em TableLayoutPanel aninhados com dimensionamento automático.
Também existe uma sobrecarga com predicado, útil quando você quer suspender o layout apenas de contêineres específicos.
using (container.SuspendPainting(
control => control is TableLayoutPanel or FlowLayoutPanel))
{
container.Font = newFont;
}
Os métodos BeginSuspendPainting e EndSuspendPainting da interface ISupportSuspendPainting existem para melhorias futuras do Designer. Portanto, no código da aplicação, prefira sempre as extensões descartáveis.
KioskModeManager no WinForms no .NET 11
O novo componente KioskModeManager do WinForms no .NET 11 controla experiências em tela cheia sem código manual de gerenciamento de janela. Você pode adicioná-lo pelo Designer ou criá-lo diretamente no código.
Entre as propriedades, FullScreen alterna a tela cheia, TopMostInFullScreen mantém a janela no topo e ToggleFullScreenKeys define o atalho, que por padrão é F11. Já EscapeExitsFullScreen permite sair com Esc, enquanto MousePointerAutoHideDelay esconde o ponteiro após inatividade.
using System.Windows.Forms;
ApplicationConfiguration.Initialize();
Form form = new() { Text = "Kiosk" };
using KioskModeManager kiosk = new()
{
ContainerControl = form,
TopMostInFullScreen = true,
ToggleFullScreenKeys = Keys.F11,
EscapeExitsFullScreen = true,
AlwaysOn = true,
MousePointerAutoHideDelay = 3_000,
FullScreen = true
};
Application.Run(form);
A propriedade AlwaysOn pede ao Windows que não entre em suspensão por inatividade. No entanto, ela não sobrescreve todas as políticas do sistema.
Atenção a um detalhe crítico: o componente não é uma barreira de segurança. Para um quiosque realmente bloqueado, o administrador precisa configurar o Windows no nível do sistema operacional.
Analyzers do Designer no WinForms no .NET 11
Os novos analyzers do WinForms no .NET 11 apontam código que o Designer não consegue ler de volta. Isso ajuda muito quando o Copilot ou outro modelo de IA gera ou refatora um formulário.
Na prática, cada mudança incompatível vira um diagnóstico Roslyn com uma mensagem explicando o erro e a correção. Assim, até agentes menos capazes ou modelos locais conseguem consertar o código sozinhos.
As regras valem para .NET 11 em diante, não para o .NET Framework. Além disso, elas vêm ativadas por padrão no SDK de desktop do Windows.
Principais regras dos analyzers
A regra WFO3000 reporta loops, condicionais, using, await e tratamento de exceções dentro de InitializeComponent. Por outro lado, a WFO3001 reclama de propriedades, métodos ou tipos aninhados no arquivo partial do Designer.
Outras regras bloqueiam recursos modernos de sintaxe nesse arquivo. Por exemplo, a WFO3004 proíbe collection expressions, a WFO3006 proíbe o operador ternário e a WFO3010 proíbe lambdas.
Há também a WFO2000, um aviso geral que não se limita ao Designer. Ela aparece quando um getter devolve uma nova instância de tipo de referência a cada chamada.
Caso precise de uma exceção intencional, reduza a severidade de uma regra específica em uma seção restrita do .editorconfig.
[LegacyForm.Designer.cs]
dotnet_diagnostic.WFO3000.severity = warning
dotnet_diagnostic.WFO3005.severity = suggestion
Contudo, reduzir ou suprimir o diagnóstico não torna o código compatível com o Designer. A regra só deixa de avisar.
Correções de bugs do RC 2
O RC 2 do WinForms no .NET 11 também traz uma lista grande de correções. Entre elas, o valor Classic definido na janela Properties não volta mais para Inherit no código gerado.
Os renderizadores modernos de Button, CheckBox e RadioButton agora preservam cores herdadas e respeitam BackColor definido explicitamente. Além disso, imagens de fundo do GroupBox cobrem cabeçalho e corpo de forma contínua.
As métricas de TextBox, ComboBox, NumericUpDown e DomainUpDown também ficaram mais consistentes. Com isso, os controles de linha única deixam de ficar grandes demais e o texto não perde mais as descendentes das letras.
Por fim, o switch Windows.Clipboard.ThrowExceptionsForGetAPIs restaura no WPF o lançamento de exceções das APIs Clipboard.Get*. Ele vale apenas para o WPF e não cria uma nova API de clipboard no WinForms.
Conclusão sobre o WinForms no .NET 11
O WinForms no .NET 11 mostra que o framework continua vivo e recebendo investimento real da Microsoft. O novo renderizador, o toggle switch e a integração com acessibilidade aproximam aplicações antigas das convenções visuais atuais.
Ao mesmo tempo, a equipe tomou decisões cuidadosas para não quebrar quem já está em produção. Por isso, o modo clássico continua padrão e os controles compostos esperam a modernização completa.
Se você mantém aplicações desktop, comece revisando os layouts posicionados por pixel e migrando para TableLayoutPanel. Em seguida, teste o modo Net11 em um formulário isolado antes de ativar globalmente.
Vale também acompanhar outras novidades da plataforma, como as otimizações de alocação com StringBuilder.MoveChunks. Assim, você chega preparado à versão final do WinForms no .NET 11.
FAQ
O modo Net11 vem ativado por padrão?
Não. Ativar visual styles mantém o padrão em Classic, e você precisa chamar SetDefaultVisualStylesMode(VisualStylesMode.Net11) explicitamente.
Ativar o dark mode liga o novo renderizador?
Não. Modo escuro e versão do renderizador são escolhas independentes no .NET 11.
Por que meu DataGridView continua com visual antigo?
Porque o RC 2 mantém ToolStrip e DataGridView no modo clássico por padrão. Você pode testar o renderizador moderno com os switches do AppContext.
O KioskModeManager impede que o usuário saia da aplicação?
Não. O componente não é uma barreira de segurança, e o bloqueio real depende da configuração do Windows.
Os novos analyzers funcionam no .NET Framework?
Não. As regras WFO valem apenas para o .NET 11 e versões posteriores.