Novidades no Windows Forms para .NET 11 Preview

Este artigo oferece uma visão geral do que há de novo no Windows Forms (WinForms) em .NET 11 Preview. Para informações detalhadas, consulte Anúncios de Lançamento. Utilize os anúncios de lançamento para obter uma visão geral de toda a versão do .NET 11. O resto deste artigo destaca as alterações mais importantes ao Windows Forms.

.NET 11 Preview 7 foi lançado em agosto de 2026.

Anúncios de lançamento

Cada anúncio de lançamento fornece informações detalhadas sobre as alterações no 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-lhe aderir a um pipeline de renderização atualizado ao nível da aplicação e do controlo. Escolha entre o renderizador clássico (VisualStylesMode.Classic), estilos visuais totalmente desligados (VisualStylesMode.Disabled), e o renderizador moderno (VisualStylesMode.Net11). VisualStylesMode.Latest é sempre convertido para o modo mais recente suportado pelo ambiente de execução. Os controlos subordinados assumem por predefinição VisualStylesMode.Inherit, pelo que a definição é propagada do controlo principal para o subordinado.

O Net11 modo traz renderização modernizada para Button, CheckBox, RadioButton, GroupBox, TextBox, e RichTextBox. A FlatStyle propriedade nos botões e caixas de seleção, e na BorderStyle propriedade nas caixas de texto, definem o estilo de renderização. A Grelha de Propriedades expõe agora a propriedade Padding nas caixas de texto e nas caixas de texto formatado, e aplica-a quando VisualStylesMode é Net11 ou posterior.

Control.VisualStylesMode é uma propriedade ambiente, semelhante a BackColor ou Font. A resolução sobe na cadeia parental e, quando atinge o nível superior, cai para Application.DefaultVisualStylesMode. Chame Control.GetVisualStylesModeChangeImpact para ver o que precisa de 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 definições visuais do sistema

System.Windows.Forms.Application.SystemVisualSettings expõe a cor de destaque, o estado de alto contraste, a visibilidade dos indicadores do teclado, as definições de animação da área do cliente, as métricas do contorno de foco e o fator de escala do texto num único instantâneo. O novo System.Windows.Forms.Application.SystemVisualSettingsChanged evento é ativado sempre que uma dessas categorias muda, por isso só podes atualizar a interface afetada em vez de reconstruir os recursos do tema em todas as notificações. System.Windows.Forms.SystemVisualSettingsChangedEventArgs.Changed é um SystemVisualSettingsCategories valor de flags que indica quais as categorias alteradas. Os controlos podem sobrepor-se a OnSystemVisualSettingsChanged para responderem 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}.");
  }
};

Revelação de forma adiada

System.Windows.Forms.FormRevealMode dá às aplicações controlo sobre quando um formulário se torna visível durante o arranque. FormRevealMode.Deferred mantém um formulário oculto até que o seu esquema inicial e estilo visual estejam estabilizados, evitando o breve aparecimento de uma janela sem formatação quando o modo escuro ou os novos estilos visuais são aplicados depois de o formulário ser exibido pela primeira vez. FormRevealMode.Classic preserva o comportamento existente de mostrar imediatamente, e FormRevealMode.Inherit segue o conjunto de valores com Application.SetDefaultFormRevealMode. Chame Application.IsFormRevealDeferred para obter o estado resolvido e trate o evento Form.FormRevealModeChanged quando o valor se alterar.

using System.Windows.Forms;

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

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

Suspensão da pintura durante mutações em massa

A nova System.Windows.Forms.ISupportSuspendPainting interface e o método de extensão ControlMutationExtensions.SuspendPainting combinam BeginUpdate/EndUpdate e SuspendLayout/ResumeLayout num único âmbito IDisposable. LayoutSuspendTraversal controla se a suspensão se aplica apenas ao alvo ou ao alvo e a todos os seus descendentes. Esta abordagem é útil quando aplicas alterações a contentores aninhados TableLayoutPanel com autodimensionamento, onde a suspensão previne tempestades de layout e cintilação.

ComboBox, ListBox, ListView, RichTextBox, e TreeView agora implementa ISupportSuspendPainting. Fazem passar os seus padrões de suspensão já estabelecidos (BeginUpdate/EndUpdate) pela nova interface, para que as edições em lote evitem a cintilação sem ter de gerir vários pares de chamadas. Para todos os outros controlos, o comportamento de suspensão constitui uma novidade.

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 interruptor de alavanca para CheckBox e RadioButton

System.Windows.Forms.Appearance.ToggleSwitch é um novo valor para CheckBox.Appearance que apresenta o controlo como um interruptor em VisualStylesMode.Net11. O comportamento existente de Checked, CheckedChanged e da associação de dados mantém-se inalterado, pelo que não precisa de atualizar o código ao mudar um(a) CheckBox para o novo aspeto. Podes modernizar os controlos de caixas de seleção para alinhares com as convenções contemporâneas da interface de utilizador sem encontrar alterações graves.

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 a mudar até que o .NET 11 chegue à GA. Com base em testes exploratórios e feedback dos clientes, os controlos que usam definições não clássicas do Visual Style poderão ocupar mais ou menos espaço nas próximas versões do .NET 11 (RC, GA) do que no Preview 7. O comportamento das novas APIs pode igualmente mudar em detalhes ou em cenários específicos.

Por esta razão, evite um design pixel-perfeito ao adotar estas funcionalidades. Prefira abordagens baseadas em layout usando TableLayoutPanel e FlowLayoutPanel, que se adaptam automaticamente a alterações nas métricas de controlo.

Área de Transferência

  • Clipboard.GetText com TextDataFormat.Rtf agora lê corretamente dados RTF da área de transferência que não inclui um terminador nulo. Esta correção resolve um problema em que conteúdos RTF válidos copiados de aplicações como o PowerPoint devolvem uma cadeia vazia.

  • GetDataObject() devolve um IDataObject que pode conter dados bitmap colocados na área de transferência e GetImage() recupera a imagem bitmap desse objeto de dados. GetImage() também recupera a imagem diretamente da prancheta. GetImage() Agora recupera imagens através do pipeline de clipboard digitado ao chamar TryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...) e retorna null quando não consegue recuperar uma imagem.

    O código seguinte agora percorre imagens bitmap quando bitmapBitmap existe e obtém a imagem através do objeto de dados retornado:

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

Barra de ferramentas

  • ToolStripDropDown agora preserva o controlo dos menus modais durante alterações de foco, pelo que o SmartTag e a interface do menu pendente fecham normalmente quando os utilizadores mudam de separador ou deslocam o foco para outros controlos. Isto corrige uma regressão que fazia com que os dropdowns permanecessem abertos de forma inadequada.

  • ToolStrip controlos com TabStop=true já não ativam incorretamente o tratamento do menu após a navegação com a tecla Tab. Anteriormente, este comportamento impedia que controlos como TreeView recebessem entrada das teclas de seta.

  • ToolStripDropDownMenu O deslocamento agora lida corretamente com os limites do menu, sem deslocamentos para fora dos limites nem fechar involuntariamente o menu pendente.

  • ToolStrip As alterações ao DPI agora mantêm o DPI anterior do dispositivo durante o caminho de mudança do DPI, por isso a lógica de escalonamento corre corretamente quando se movem os controlos entre ecrãs com definições diferentes de DPI.

Esquema

  • AnchorLayoutV2 Agora inicializa corretamente os metadados de âncora em falta quando os controlos ancorados são substituídos durante uma passagem de layout suspensa, evitando inconsistências de layout.

Estruturador

  • Os designers de Windows Forms alojados podem agora colar controlos através do CommandSet.OnMenuPaste novamente, restaurando funcionalidades de colagem que antes estavam quebradas.

  • As legendas do editor de coleções para controlos personalizados agora mostram o tipo de controlo subjacente em vez do nome do wrapper gerado ControlProxy<T> , facilitando a identificação de controlos no designer.

PropertyGrid

Modo escuro

  • ProgressBar agora tem cores padrão de primeiro plano e fundo para renderização em modo escuro, melhorando a consistência visual em aplicações com tema Fluent.

Correções de erros

  • Control: A SendKeys regressão sequencial de modificadores imediatos (como ^a^c, +a+c, %f%t) é fixa. Já KeyboardToolTipStateMachine não é lançado KeyNotFoundException quando o foco muda durante um evento pop-up de tooltip.

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

  • NumericUpDown: A regressão de renderização de botões que ocorre quando os estilos visuais são desativados é corrigida.

  • SplitContainer: O controlo agora lida com um GDI+ ExternalException transitório durante a transição da sessão de visualização ao chamar RepaintSplitterRect.

  • ToolStrip: O botão de descer já não é ativado ao descer. Os ícones indeterminados e selecionados ToolStripMenuItem estão agora visíveis no modo escuro.

  • PropertyGrid: O ícone do botão da página Propriedades já não muda quando LargeButtons está ativado com DPI elevado. ResetHelpForeColor Agora reinicia corretamente a cor do primeiro plano em vez da cor de fundo.

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

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