Neuerungen in Windows Forms für .NET 7
In diesem Artikel werden einige der neuen Features und Verbesserungen von Windows Forms in .NET 7 beschrieben.
Es gibt einige Breaking Changes, die Sie bei der Migration von .NET Framework zu .NET 7 beachten sollten. Weitere Informationen finden Sie unter Breaking Changes in Windows Forms.
Verbesserungen bei hohen DPI-Werten
Das Rendering bei hohen DPI-Werten mit PerMonitorV2 wurde verbessert:
Ordnungsgemäße Skalierung geschachtelter Steuerelemente. Beispielsweise eine Schaltfläche, die sich in einem Bereich befindet, der auf einer Registerkartenseite platziert wird.
Skalieren Sie Form.MaximumSize- und Form.MinimumSize-Eigenschaften basierend auf den aktuellen DPI-Einstellungen für Monitore für Anwendungen, die
ApplicationHighDpiMode
ausführen, das aufPerMonitorV2
festgelegt ist.In .NET 7 ist dieses Feature standardmäßig deaktiviert, und Sie müssen es aktivieren, um diese Änderung zu erhalten. Ab .NET 8 ist dieses Feature standardmäßig aktiviert, und Sie müssen es deaktivieren, um zum vorherigen Verhalten zurückzukehren.
Um das Feature zu aktivieren, legen Sie die Einstellung
configProperties
in runtimeconfig.json fest:{ "runtimeOptions": { "tfm": "net7.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true, } } }
Verbesserte Barrierefreiheit und Fehlerkorrekturen
Diese Version fügt weitere Verbesserungen hinsichtlich der Barrierefreiheit hinzu, einschließlich, aber nicht beschränkt auf die folgenden Elemente:
Viele Probleme im Zusammenhang mit Ankündigungen, die in Sprachausgaben beobachtet wurden, wurden behoben, um sicherzustellen, dass die Informationen zu Steuerelementen korrekt sind. Beispielsweise kündigt ListView jetzt richtig an, wenn eine Gruppe erweitert oder reduziert wird.
Weitere Steuerelemente bieten jetzt Unterstützung für die Benutzeroberflächenautomatisierung:
Arbeitsspeicherverluste im Zusammenhang mit dem Ausführen einer Windows Forms-Anwendung unter Hilfstools wie der Sprachausgabe wurden behoben.
Hilfstools zeichnen jetzt präzise Fokusindikatoren und melden korrekte Begrenzungsrahmen für geschachtelte Formulare und einige Elemente zusammengesetzter Steuerelemente, z. B. DataGridView, ListView und TabControl.
Das ExpandCollapse-Steuerelementmuster der Automatisierungsbenutzeroberfläche wurde in ListView-, TreeView- und PropertyGrid-Steuerelementen ordnungsgemäß implementiert und wird nur für erweiterbare Elemente aktiviert.
Verschiedene Korrekturen des Farbkontrastverhältnisses in Steuerelementen.
Verbesserungen der Sichtbarkeit für ToolStripTextBox und ToolStripButton in Designs mit hohem Kontrast.
Verbesserungen bei der Datenbindung (Vorschau)
Während Windows Forms bereits über eine leistungsfähige Bindungs-Engine verfügte, wird eine modernere Form der Datenbindung eingeführt, ähnlich wie die von WPF bereitgestellte Datenbindung.
Mit den neuen Features zur Datenbindung können Sie das MVVM-Muster vollständig nutzen und objektrelationale Mapper aus ViewModels in Windows Forms einfacher verwenden als zuvor. Dies wiederum ermöglicht es, Code in den CodeBehind-Dateien zu reduzieren und neue Testmöglichkeiten zu eröffnen. Wichtiger noch, damit wird so die gemeinsame Verwendung von Code durch Windows Forms und andere .NET-GUI-Frameworks wie WPF, UWP/WinUI und .NET MAUI ermöglicht. Und um eine häufig gestellte Frage zu klären, gibt es keine Pläne, XAML in Windows Forms einzuführen.
Diese neuen Datenbindungsfeatures befinden sich in der Vorschau für .NET 7, und an diesem Feature wird in .NET 8 weiter gearbeitet.
Um die neue Bindung zu aktivieren, fügen Sie der Projektdatei die Einstellung EnablePreviewFeatures
hinzu. Dies wird sowohl in C# als auch in Visual Basic unterstützt.
<Project Sdk="Microsoft.NET.Sdk">
<!-- other settings -->
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
Der folgende Codeschnipsel demonstriert die neuen Eigenschaften, Ereignisse und Methoden, die den verschiedenen Klassen in Windows Forms hinzugefügt wurden. Auch wenn das folgende Codebeispiel in C# geschrieben ist, gilt es auch 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);
}
Sonstige Verbesserungen
Hier sind einige weitere wichtige Änderungen:
- Die Drag & Drop-Behandlung entspricht der Drag & Drop-Funktion von Windows mit umfangreicheren Anzeigeeffekten wie Symbolen und Beschriftungen.
- Ordner- und Dateidialogfelder ermöglichen weitere Optionen:
- Hinzufügen zu „Zuletzt verwendet“
- Schreibzugriff überprüfen
- Aufgeklappter Modus
- OK erfordert Interaktion
- Schreibgeschützt auswählen
- Ausgeblendete Dateien anzeigen
- Angeheftete Speicherorte anzeigen
- Vorschau anzeigen
- ErrorProvider verfügt jetzt über eine HasErrors-Eigenschaft.
- Das Andocklayout des Formulars wurde für Windows 11 behoben.
Siehe auch
.NET Desktop feedback