Wat is er nieuw in Windows Forms voor .NET 9
In dit artikel wordt beschreven wat er nieuw is in Windows Forms voor .NET 9.
Asynchrone formulieren
Belangrijk
Deze functieset is experimenteel.
Moderne apps vereisen asynchrone communicatiemodellen. Naarmate Windows Forms verder is ontwikkeld op .NET, vereisen meer componenten marshaling naar een async
-methode om uit te voeren op de UI-thread. Besturingselementen zoals WebView2, systeemeigen Windows 10- en Windows 11-API's of moderne asynchrone bibliotheken zoals Semantic Kernel. Een ander scenario is waar u MVVM ViewModels deelt die zijn gebouwd rond async
met Windows Forms uit andere UI-stacks, zoals WPF, WinUI of .NET MAUI.
Hieronder volgt een lijst met nieuwe methoden die zijn toegevoegd ter ondersteuning van asynchrone scenario's:
- System.Windows.Forms.Form.ShowAsync
- Form.ShowDialogAsync
- TaskDialog.ShowDialogAsync
- Control.InvokeAsync (deze API is niet experimenteel.)
Deze API wordt bewaakt achter een compilerfout omdat deze experimenteel is. Als u de fout wilt onderdrukken en toegang tot de API wilt inschakelen, voegt u de volgende PropertyGroup
toe aan uw projectbestand:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>
Fooi
Zie Compilerfout WFO5002voor meer informatie over het onderdrukken van deze regel.
BinaryFormatter wordt niet meer ondersteund
BinaryFormatter
wordt beschouwd als onveilig omdat het kwetsbaar is voor deserialisatieaanvallen, wat kan leiden tot Denial of Service (DoS), openbaarmaking van informatie of uitvoering van externe code. Het is geïmplementeerd voordat beveiligingsproblemen met deserialisatie goed werden begrepen en het ontwerp volgt geen moderne aanbevolen procedures voor beveiliging.
Vanaf .NET 9 is de implementatie ervan verwijderd om deze beveiligingsrisico's te voorkomen. Wanneer BinaryFormatter
wordt gebruikt, wordt de PlatformNotSupportedException
-exception geworpen.
Windows Forms heeft in veel scenario's BinaryFormatter
gebruikt, zoals bij het serialiseren van gegevens voor klembord- en slepen-en-neerzetten-bewerkingen, en vooral de Windows Forms Designer. Windows Forms blijft intern een veiligere subset van BinaryFormatter
gebruiken om specifieke use cases met een bekende set typen af te handelen.
Windows Forms voor .NET 9 wordt geleverd met analyses die u helpen bij het identificeren van tijden die u onbewust deelneemt aan binaire serialisatie.
Zie Migratiehandleiding voor Windows Forms voor BinaryFormattervoor meer informatie over BinaryFormatter
.
Donkere modus
Belangrijk
Deze functieset is experimenteel.
Voorlopige ondersteuning voor donkere modus is toegevoegd aan Windows Forms, met als doel ondersteuning in .NET 10 te voltooien. Wanneer de kleurmodus wordt gewijzigd, wordt de SystemColors gewijzigd zodat deze overeenkomt. De kleurmodus voor de app kan worden ingesteld op een van de volgende waarden:
-
SystemColorMode.Classic
( standaard) Lichte modus, hetzelfde als eerdere versies van Windows Forms. -
SystemColorMode.System
- Respecteer de lichte of donkere modus die door Windows is ingesteld. -
SystemColorMode.Dark
: gebruik de donkere modus.
Als u een kleurmodus wilt toepassen, roept u Application.SetColorMode(SystemColorMode) aan in de opstartcode van het programma:
namespace MyExampleProject;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.SetColorMode(SystemColorMode.Dark);
Application.Run(new Form1());
}
}
Friend Module Program
<STAThread()>
Friend Sub Main(args As String())
Application.SetHighDpiMode(HighDpiMode.SystemAware)
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
Application.SetColorMode(SystemColorMode.Dark)
Application.Run(New Form1)
End Sub
End Module
Deze API wordt bewaakt achter een compilerfout omdat deze experimenteel is. Als u de fout wilt onderdrukken en toegang tot de API wilt inschakelen, voegt u de volgende PropertyGroup
toe aan uw projectbestand:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>
Tip
Zie compilerfout WFO5001voor meer informatie over het onderdrukken van deze regel.
Verbeteringen in FolderBrowserDialog
FolderBrowserDialog
ondersteunt nu het selecteren van meerdere mappen, die zijn opgeslagen in de SelectedPaths matrix. Als u meerdere mappen wilt inschakelen, stelt u Multiselect in op true
.
Nieuwe functies en verbeteringen in System.Drawing
De System.Drawing-bibliotheek heeft veel verbeteringen ondergaan, waaronder het omvatten van GDI+-effecten, ondersteuning voor ReadOnlySpan
en het beter genereren van interoperabiliteitscode.
System.Drawing ondersteunt GDI+ effecten
De bibliotheek System.Drawing ondersteunt nu GDI+ bitmapeffecten, zoals vervagen en tinten. Effecten zijn onderdeel geweest van GDI+, maar werden tot nu toe niet weergegeven via System.Drawing.
Effecten worden toegepast op een Bitmap door de methode Bitmap.ApplyEffect(Effect, Rectangle) aan te roepen. Geef het effect en een optionele Rectangle
op voor het gebied waarop het effect moet worden toegepast. Gebruik Rectangle.Empty om de hele afbeelding te verwerken.
De System.Drawing.Imaging.Effects naamruimte bevat de effecten die u kunt toepassen:
- BlackSaturationCurveEffect
- BlurEffect
- BrightnessContrastEffect
- ColorBalanceEffect
- ColorCurveEffect
- ColorLookupTableEffect
- ColorMatrixEffect
- ContrastCurveEffect
- CurveChannel
- DensityCurveEffect
- ExposureCurveEffect
- GrayScaleEffect
- HighlightCurveEffect
- InvertEffect
- LevelsEffect
- MidtoneCurveEffect
- ShadowCurveEffect
- SharpenEffect
- TintEffect
- VividEffect
- WhiteSaturationCurveEffect
System.Drawing ondersteunt Span
Veel methoden die arrays accepteerden, zijn uitgebreid om ook ReadOnlySpan
te accepteren. Bijvoorbeeld methoden zoals GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>)en DrawPolygon(Pen, ReadOnlySpan<Point>), accepteren een matrix of ReadOnlySpan
.
CsWin32 gebruiken voor interop
Alle interoperabiliteitscode is vervangen door CsWin32, een C# P/Invoke-brongenerator.
Werkbalk
De volgende verbeteringen zijn toegevoegd aan de besturingselementen ToolStrip en ToolStripItem.
Er is een nieuwe eigenschap toegevoegd aan
ToolStrip
, AllowClickThrough.Als dit is ingesteld op
true
, kan het besturingselement worden gebruikt terwijl het formulier niet actief is.
Toen .NET Core 3.1 werd uitgebracht, zijn alle Menu
-gerelateerde besturingselementen, zoals MainMenu
en MenuItem
, verwijderd.
ToolStrip
en ToolStripMenuItem
moeten worden gebruikt.
ToolStripItem
, de basisklasse voor ToolStripMenuItem
, had echter geen vervanging voor de MenuItem.Select
-gebeurtenis. Deze gebeurtenis is gegenereerd wanneer de muis of het toetsenbord wordt gebruikt om het item te markeren.
.NET 9 heeft ToolStripItem.SelectedChangedtoegevoegd, die kan worden gebruikt om te detecteren wanneer een menu-item is gemarkeerd.
.NET Desktop feedback