Novidades do .NET 7 (Windows Forms .NET)
Este artigo descreve alguns dos novos recursos e aprimoramentos do Windows Forms no .NET 7.
Há algumas alterações recentes que você deve estar ciente ao migrar do .NET Framework para o .NET 7. Para obter mais informações, consulte Alterações recentes no Windows Forms.
Melhorias de alto DPI
A renderização de alto DPI com PerMonitorV2 foi melhorada:
Dimensione corretamente os controles aninhados. Por exemplo, um botão que está em um painel, que é colocado em uma página de guia.
Dimensionamento Form.MaximumSize e Form.MinimumSize propriedades com base nas configurações de DPI do monitor atual para aplicativos executados
ApplicationHighDpiMode
definidos comoPerMonitorV2
.No .NET 7, esse recurso é desabilitado por padrão e você deve aceitar receber essa alteração. A partir do .NET 8, esse recurso é habilitado por padrão e você precisa desativá-lo para reverter para o comportamento anterior.
Para habilitar o recurso, defina a
configProperties
configuração em runtimeconfig.json:{ "runtimeOptions": { "tfm": "net7.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true, } } }
Melhorias e correções de acessibilidade
Esta versão adiciona mais melhorias à acessibilidade, incluindo, mas não se limitando aos seguintes itens:
Muitos problemas relacionados a anúncios observados em leitores de tela foram resolvidos, garantindo que as informações sobre controles estejam corretas. Por exemplo, ListView agora anuncia corretamente quando um grupo é expandido ou recolhido.
Mais controles agora fornecem suporte à automação da interface do usuário:
Vazamentos de memória relacionados à execução de um aplicativo do Windows Forms em ferramentas de assistência, como o Narrador, foram corrigidos.
As ferramentas de assistência agora desenham com precisão indicadores de foco e relatam retângulos delimitadores corretos para formulários aninhados e alguns elementos de controles compostos, como DataGridView, ListViewe TabControl.
O padrão de controle ExpandCollapse da interface do usuário de automação foi implementado corretamente nos ListViewcontroles , TreeViewPropertyGrid e só é ativado para itens expansíveis.
Várias correções de taxa de contraste de cores nos controles.
Melhorias de visibilidade para ToolStripTextBox e ToolStripButton em temas de alto contraste.
Melhorias na vinculação de dados (visualização)
Embora o Windows Forms já tivesse um poderoso mecanismo de vinculação, uma forma mais moderna de vinculação de dados, semelhante à vinculação de dados fornecida pelo WPF, está sendo introduzida.
Os novos recursos de vinculação de dados permitem que você adote totalmente o padrão MVVM e o uso de mapeadores relacionais de objetos de ViewModels no Windows Forms com mais facilidade do que antes. Isso, por sua vez, torna possível reduzir o código nos arquivos code-behind e abre novas possibilidades de teste. Mais importante, ele permite o compartilhamento de código entre o Windows Forms e outras estruturas da GUI do .NET, como WPF, UWP/WinUI e .NET MAUI. E para esclarecer uma pergunta comum, não há planos para introduzir o XAML no Windows Forms.
Esses novos recursos de vinculação de dados estão em visualização para o .NET 7, e mais trabalho sobre esse recurso acontecerá no .NET 8.
Para habilitar a nova associação, adicione a EnablePreviewFeatures
configuração ao arquivo de projeto. Isso é suportado em C# e Visual Basic.
<Project Sdk="Microsoft.NET.Sdk">
<!-- other settings -->
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
O trecho de código a seguir demonstra as novas propriedades, eventos e métodos adicionados às várias classes no Windows Forms. Mesmo que o exemplo de código a seguir está em C#, ele também se aplica ao Visual Basic.
public class Control {
[BindableAttribute(true)]
public virtual object DataContext { get; set; }
[BrowsableAttribute(true)]
public event EventHandler DataContextChanged;
protected virtual void OnDataContextChanged(EventArgs e);
protected virtual void OnParentDataContextChanged(EventArgs e);
}
[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent, IComponent, IDisposable {
protected BindableComponent();
public BindingContext? BindingContext { get; set; }
public ControlBindingsCollection DataBindings { get; }
public event EventHandler BindingContextChanged;
protected virtual void OnBindingContextChanged(EventArgs e);
}
public abstract class ButtonBase : Control {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand? Command { get; set; }
[BindableAttribute(true)]
public object? CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
public abstract class ToolStripItem : BindableComponent, IComponent, IDisposable, IDropTarget {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand Command { get; set; }
[BindableAttribute(true)]
public object CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
Melhorias diversas
Aqui estão algumas outras mudanças notáveis:
- A manipulação de arrastar e soltar corresponde à funcionalidade de arrastar e soltar do Windows com efeitos de exibição mais avançados, como ícones e rótulos de texto.
- As caixas de diálogo de pastas e arquivos permitem mais opções:
- Adicionar aos recentes
- Verificar o acesso de gravação
- Modo expandido
- OK requer interação
- Selecionar somente leitura
- Mostrar arquivos ocultos
- Mostrar locais fixos
- Mostrar pré-visualização
- ErrorProvider tem um HasErrors imóvel agora.
- O layout de ajuste do formulário foi corrigido para o Windows 11.
Confira também
.NET Desktop feedback