Novidades no Windows Forms para .NET versão prévia 11

Este artigo fornece uma visão geral de alto nível do que há de novo com Windows Forms (WinForms) no .NET 11 Preview. Para obter informações detalhadas, consulte anúncios de lançamento. Use os comunicados de versão para obter uma visão geral de toda a versão .NET 11. O restante deste artigo destaca as alterações mais importantes para Windows Forms.

.NET 11 Versão Prévia 7 foi lançado em agosto de 2026.

Anúncios de Lançamento

Cada comunicado de versão fornece informações detalhadas sobre as alterações do Windows Forms para o .NET 11.

Estilos visuais e aparência

System.Windows.Forms.Application.SetDefaultVisualStylesMode e a nova propriedade System.Windows.Forms.Control.VisualStylesMode permitem que você adote um pipeline de renderização renovado nos níveis de aplicativo e de controle. Escolha entre o renderizador clássico (VisualStylesMode.Classic), os estilos visuais desativados inteiramente (VisualStylesMode.Disabled) e o renderizador moderno (VisualStylesMode.Net11). VisualStylesMode.Latest é sempre convertido para o modo mais recente compatível com o runtime. Os controles filhos têm como padrão VisualStylesMode.Inherit, de modo que a configuração é propagada do pai para o filho.

O Net11 modo traz renderização modernizada para Button, CheckBox, , RadioButton, GroupBoxe TextBoxRichTextBox. A FlatStyle propriedade em botões e caixas de seleção e a BorderStyle propriedade em caixas de texto definem o estilo de renderização. A Grade de Propriedades agora expõe a propriedade Padding em caixas de texto e caixas de texto rich text, e a aplica quando VisualStylesMode é Net11 ou mais recente.

Control.VisualStylesMode é uma propriedade ambiente, semelhante a BackColor ou Font. A resolução percorre a cadeia hierárquica superior e, ao atingir o nível mais alto, desce para Application.DefaultVisualStylesMode. Chame Control.GetVisualStylesModeChangeImpact para verificar o que precisa ser atualizado quando os modos mudam e use a propriedade Control.EffectiveVisualStylesMode para obter o valor resolvido após a herança.

using System.Windows.Forms;

Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);

Form form = new()
{
  Text = "Modern visual styles",
  VisualStylesMode = VisualStylesMode.Latest,
};

ComboBox combo = new() { Dock = DockStyle.Top };
combo.Items.AddRange(["One", "Two", "Three"]);
form.Controls.Add(combo);

Application.Run(form);

Reagir às configurações visuais do sistema

System.Windows.Forms.Application.SystemVisualSettings expõe a cor de destaque, o estado de alto contraste, a visibilidade de indicadores de teclado, as configurações de animação da área do cliente, as métricas da borda de foco e o fator de escala de texto como um único snapshot. O novo evento System.Windows.Forms.Application.SystemVisualSettingsChanged é disparado sempre que uma dessas categorias é alterada, para que você possa atualizar apenas a interface do usuário afetada em vez de recriar os recursos do tema a cada notificação. System.Windows.Forms.SystemVisualSettingsChangedEventArgs.Changed é um valor de SystemVisualSettingsCategories sinalizadores que indica quais categorias foram alteradas. Os controles podem substituir OnSystemVisualSettingsChanged para responder localmente.

using System.Drawing;
using System.Windows.Forms;

Application.SystemVisualSettingsChanged += (sender, e) =>
{
  if ((e.Changed & SystemVisualSettingsCategories.AccentColor) != 0)
  {
    Color accent = e.NewSettings.AccentColor;
    Console.WriteLine($"Accent color changed to {accent}.");
  }

  if ((e.Changed & SystemVisualSettingsCategories.TextScale) != 0)
  {
    Console.WriteLine($"Text scale is now {e.NewSettings.TextScaleFactor:P0}.");
  }
};

Exibição postergada do formulário

System.Windows.Forms.FormRevealMode fornece aos aplicativos controle sobre quando um formulário fica visível durante a inicialização. FormRevealMode.Deferred mantém um formulário oculto até que seu layout inicial e a aplicação de temas sejam consolidados, evitando o breve lampejo de uma janela sem estilo quando o modo escuro ou os novos estilos visuais são aplicados após a exibição inicial do formulário. FormRevealMode.Classic preserva o comportamento existente de mostrar imediatamente, e FormRevealMode.Inherit segue o valor definido com Application.SetDefaultFormRevealMode. Chame Application.IsFormRevealDeferred para obter o estado resolvido e manipule o Form.FormRevealModeChanged evento quando o valor for alterado.

using System.Windows.Forms;

Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);
Application.SetDefaultFormRevealMode(FormRevealMode.Deferred);

Form form = new() { Text = "No unstyled flash on startup" };
Application.Run(form);

Suspender a renderização durante mutações em lote

A nova interface System.Windows.Forms.ISupportSuspendPainting e o método de extensão ControlMutationExtensions.SuspendPainting combinam BeginUpdate/EndUpdate e SuspendLayout/ResumeLayout em um único escopo IDisposable. LayoutSuspendTraversal controla se a suspensão aplica-se somente ao alvo ou ao alvo e a todos os seus descendentes. Essa abordagem é útil ao aplicar alterações a contêineres TableLayoutPanel aninhados com dimensionamento automático, situação em que a suspensão evita "tempestades de layout" e cintilação.

ComboBox, ListBox, ListView, RichTextBox e TreeView agora implementam ISupportSuspendPainting. Eles direcionam seus padrões de suspensão estabelecidos (BeginUpdate/EndUpdate) por meio da nova interface, de modo que edições em massa evitam cintilações sem a necessidade de gerenciar múltiplas chamadas pareadas. Para todos os outros controles, o comportamento de suspensão é novo.

using System.Windows.Forms;

ListBox list = new();

using (list.SuspendPainting(LayoutSuspendTraversal.Target))
{
  for (int i = 0; i < 10_000; i++)
  {
    list.Items.Add($"Item {i}");
  }
}

Aparência de chave seletora (toggle switch) para CheckBox e RadioButton

System.Windows.Forms.Appearance.ToggleSwitch é um novo valor para CheckBox.Appearance, que exibe o controle como um interruptor em VisualStylesMode.Net11. Os elementos existentes Checked, CheckedChanged e o comportamento de vinculação de dados permanecem inalterados, portanto, você não precisa fazer alterações no código ao mudar CheckBox para a nova aparência. Você pode modernizar os controles de caixa de seleção para se alinhar às convenções de interface do usuário contemporâneas sem encontrar alterações significativas.

using System.Windows.Forms;

CheckBox toggle = new()
{
  Text = "Enable notifications",
  Appearance = Appearance.ToggleSwitch,
  Checked = true,
};

Importante

O comportamento de renderização dos Estilos Visuais e das novas APIs associadas ainda não está definido e continua mudando até que o .NET 11 atinja a disponibilidade geral (GA). Com base em testes exploratórios e comentários do cliente, os controles que usam configurações de Estilo Visual não clássico podem ocupar mais ou menos espaço nas próximas .NET 11 versões (RC, GA) do que na Versão Prévia 7. O comportamento das novas APIs também pode mudar em detalhes ou em cenários específicos.

Por esse motivo, evite o design pixel-perfect ao adotar esses recursos. Prefira abordagens baseadas em layout usando TableLayoutPanel e FlowLayoutPanelque se adaptem automaticamente às alterações nas métricas de controle.

Área de transferência

  • Clipboard.GetText com TextDataFormat.Rtf agora lê corretamente os dados RTF da área de transferência que não incluem um terminador nulo. Essa correção resolve um problema em que o conteúdo RTF válido copiado de aplicativos como PowerPoint retornava uma cadeia de caracteres vazia.

  • GetDataObject() retorna um IDataObject que pode conter dados de bitmap posicionados na área de transferência, e GetImage() recupera a imagem de bitmap desse objeto de dados. GetImage() também recupera a imagem diretamente da área de transferência. GetImage() agora recupera imagens por meio do pipeline de área de transferência do tipo chamando TryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...) e retornando null quando não consegue recuperar uma imagem.

    O código a seguir agora preserva a integridade de imagens bitmap (ida e volta) quando bitmap é um Bitmap existente e você obtém a imagem por meio do objeto de dados retornado:

    // Round-trips again on .NET 11
    Clipboard.SetImage(bitmap);
    Image? image = Clipboard.GetDataObject()?.GetImage();
    

ToolStrip

  • ToolStripDropDown agora preserva o rastreamento de menus modais durante alterações de foco, de modo que a interface de SmartTags e menus suspensos seja fechada normalmente quando os usuários alternam entre guias ou movem o foco para outros controles. Isso corrige uma regressão que fazia com que os menus suspensos permanecessem abertos indevidamente.

  • ToolStrip controles com TabStop=true não ativam mais incorretamente o gerenciamento do menu após navegar com a tecla Tab. Anteriormente, esse comportamento impedia que controles como TreeView recebessem entrada das teclas de seta.

  • A rolagem de ToolStripDropDownMenu agora respeita corretamente as alças do menu, sem rolar além delas nem fechar involuntariamente o menu suspenso.

  • ToolStrip As alterações de DPI agora preservam a DPI do dispositivo anterior durante o caminho de alteração de DPI, portanto, a lógica de dimensionamento é executada corretamente quando você move os controles entre exibições com configurações de DPI diferentes.

Layout

  • AnchorLayoutV2 agora inicializa corretamente os metadados de âncora ausentes quando os controles ancorados são substituídos durante uma passagem de layout suspenso, evitando inconsistências de layout.

Desenhista

  • Os designers de Windows Forms hospedados agora podem colar controles por meio de CommandSet.OnMenuPaste novamente, restaurando a funcionalidade de colagem que foi interrompida anteriormente.

  • As legendas do editor de coleção para controles personalizados agora exibem o tipo de controle subjacente em vez do nome do wrapper gerado ControlProxy<T> , facilitando a identificação de controles no designer.

PropertyGrid

Modo escuro

  • ProgressBar agora tem cores de primeiro plano e plano de fundo padrão para renderização do modo escuro, melhorando a consistência visual em aplicativos com temas fluentes.

Correções de erros

  • Control: A regressão na análise sequencial de modificadores imediatos SendKeys (como ^a^c, +a+c, %f%t) foi corrigida. O KeyboardToolTipStateMachine não lança mais KeyNotFoundException quando o foco muda durante um evento de exibição de tooltip.

  • ListBox: os valores de IsSynchronized agora estão corretos em todas as coleções ListBox.

  • NumericUpDown: Foi corrigida a regressão na renderização de botões que ocorria quando os estilos visuais estavam desabilitados.

  • SplitContainer: o controle agora lida com uma exceção transitória do GDI+ ExternalException durante a transição da sessão de exibição ao chamar RepaintSplitterRect.

  • ToolStrip: o botão de rolar para baixo não gera mais erro ao rolar. Os ícones ToolStripMenuItem indeterminados e marcados agora estão visíveis no modo escuro.

  • PropertyGrid: o ícone do botão da página de propriedades não muda mais ao alternar LargeButtons em telas de DPI alto. ResetHelpForeColor agora redefine corretamente a cor do primeiro plano em vez da cor da tela de fundo.

  • PrintPreviewControl: ForeColor a renderização agora está correta quando definida como Branca.

  • Modo escuro: LinkLabel o contraste no Modo Escuro é aprimorado. TabControl aninhado em SplitContainer agora corresponde ao modo escuro. HelpProvider O texto agora está visível no modo escuro. ToolTip agora alterna para o modo escuro quando SystemColorMode.Dark é definido.