Nyheter i Windows Forms för .NET 7
I den här artikeln beskrivs några av de nya funktionerna och förbättringarna i Windows Forms i .NET 7.
Det finns några brytande ändringar som du bör känna till när du migrerar från .NET Framework till .NET 7. Mer information finns i Oförenliga ändringar i Windows Forms.
Höga DPI-förbättringar
Hög DPI-rendering med PerMonitorV2 har förbättrats:
Skala korrekt kapslade kontroller. Till exempel en knapp som finns i en panel, som placeras på en fliksida.
Skala egenskaperna Form.MaximumSize och Form.MinimumSize baserat på de aktuella DPI-inställningarna för bildskärmen för program som körs med
ApplicationHighDpiMode
inställt påPerMonitorV2
.I .NET 7 är den här funktionen inaktiverad som standard och du måste välja att ta emot den här ändringen. Från och med .NET 8 är den här funktionen aktiverad som standard och du måste välja bort den för att återgå till det tidigare beteendet.
Om du vill aktivera funktionen anger du inställningen
configProperties
i runtimeconfig.json:{ "runtimeOptions": { "tfm": "net7.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true, } } }
Hjälpmedelsförbättringar och korrigeringar
Den här versionen ger ytterligare förbättringar av tillgängligheten, inklusive men inte begränsat till följande:
Många meddelanderelaterade problem som observerats i skärmläsare har åtgärdats, vilket säkerställer att informationen om kontroller är korrekt. Till exempel meddelar ListView nu korrekt när en grupp expanderas eller fälls ihop.
Fler kontroller ger nu stöd för användargränssnittsautomatisering:
Minnesläckage relaterade till körning av Windows Forms-programmet med hjälpmedel, till exempel Skärmläsaren, har åtgärdats.
Hjälpverktyg ritar nu fokusindikatorer korrekt och rapporterar korrekta inneslutningsrektanglar för kapslade formulär och vissa element i sammansatta kontroller, såsom DataGridView, ListViewoch TabControl.
Automation-användargränssnittet ExpandCollapse-kontrollmönstret har implementerats korrekt i kontrollerna ListView, TreeViewoch PropertyGrid och aktiveras endast för expanderbara objekt.
Olika korrigeringar av färgkontrastförhållande i kontroller.
Synlighetsförbättringar för ToolStripTextBox och ToolStripButton i högkontrasteman.
Förbättringar av databindning (förhandsversion)
Windows Forms hade redan en kraftfull bindningsmotor, men en modernare form av databindning, som liknar databindningen från WPF, introduceras.
Med de nya databindningsfunktionerna kan du använda MVVM-mönstret fullt ut och använda objektrelationsmappare från ViewModels i Windows Forms enklare än tidigare. Detta gör det i sin tur möjligt att minska koden i kod bakom filer och öppnar nya testmöjligheter. Ännu viktigare är att det möjliggör koddelning mellan Windows Forms och andra .NET GUI-ramverk som WPF, UWP/WinUI och .NET MAUI. Och för att klargöra en vanlig fråga finns det inga planer på att introducera XAML i Windows Forms.
Dessa nya databindningsfunktioner finns i förhandsversion för .NET 7 och mer arbete med den här funktionen sker i .NET 8.
Om du vill aktivera den nya bindningen lägger du till inställningen EnablePreviewFeatures
i projektfilen. Detta stöds i både C# och Visual Basic.
<Project Sdk="Microsoft.NET.Sdk">
<!-- other settings -->
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
Följande kodfragment visar de nya egenskaper, händelser och metoder som lagts till i de olika klasserna i Windows Forms. Även om följande kodexempel finns i C#, gäller det även för 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);
}
Diverse förbättringar
Här följer några andra viktiga ändringar:
- Dra och släpp-hanteringen matchar Funktionerna för dra och släpp i Windows med mer omfattande visningseffekter som ikoner och textetiketter.
- Mapp- och fildialogrutor tillåter fler alternativ:
- Lägg till i senaste
- Kontrollera skrivåtkomst
- Expanderat läge
- OK kräver interaktion
- Välj endast läsbar
- Visa dolda filer
- Visa pinnade platser
- Visa förhandsgranskning
- ErrorProvider har nu en egenskap för HasErrors.
- Formulärets snäpläge är åtgärdat för Windows 11.
Se även
.NET Desktop feedback