Delen via


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:

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 ReadOnlySpanen 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:

System.Drawing ondersteunt Span

Veel methoden die arrays accepteerden, zijn uitgebreid om ook ReadOnlySpante 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.