Dela via


Nyheter i Windows Forms för .NET 9

Den här artikeln beskriver vad som är nytt i Windows Forms för .NET 9.

Asynkrona formulär

Viktig

Den här funktionsuppsättningen är experimentell, förutom Control.InvokeAsync.

Moderna appar kräver asynkrona kommunikationsmodeller. I takt med att Windows Forms har vuxit på .NET måste fler komponenter konverteras till en async-metod för att köras i användargränssnittstråden. Till exempel kontroller som WebView2, interna API:er för Windows 10 och Windows 11 eller moderna asynkrona bibliotek som semantisk kernel. Ett annat scenario skulle vara när du delar MVVM ViewModels som bygger på async med Windows Forms från andra UI-staplar som WPF, WinUI eller .NET MAUI.

Följande lista över nya metoder som lagts till för att stödja asynkrona scenarier:

Det här API:et är skyddat bakom ett kompilatorfel eftersom det är experimentellt. Om du vill förhindra felet och aktivera åtkomst till API:et lägger du till följande PropertyGroup i projektfilen:

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>

Tips

Mer information om hur du utelämnar den här regeln finns i Kompilatorfel WFO5002.

BinaryFormatter stöds inte längre

BinaryFormatter anses vara osäkert eftersom det är sårbart för deserialiseringsattacker, vilket kan leda till DoS (Denial of Service), avslöjande av information eller fjärrkörning av kod. Det implementerades innan sårbarheter för deserialisering förstods väl och dess design följer inte moderna rekommenderade säkerhetsmetoder.

Från och med .NET 9 har implementeringen tagits bort för att förhindra dessa säkerhetsrisker. När BinaryFormatter används utlöses PlatformNotSupportedException undantaget.

Windows Forms använde BinaryFormatter i många scenarier, till exempel när du serialiserar data för urklipp och dra-och-släpp-åtgärder, och kanske viktigast av allt, Windows Forms-designern. Internt fortsätter Windows Forms att använda en säkrare delmängd av BinaryFormatter för att hantera specifika användningsfall med en känd uppsättning typer.

Windows Forms för .NET 9 levereras med analysverktyg som hjälper dig att identifiera tillfällen då du omedvetet deltar i binär serialisering.

Mer information om BinaryFormatterfinns i migreringsguiden Windows Forms för BinaryFormatter.

Mörkt läge

Viktig

Den här funktionsuppsättningen är experimentell.

Preliminärt stöd för mörkt läge har lagts till i Windows Forms, med målet att slutföra stödet i .NET 10. När färgläget ändras ändras SystemColors så att de matchar. Färgläget för appen kan anges till något av följande värden:

  • SystemColorMode.Classic— (standard) Ljust läge, samma som tidigare versioner av Windows Forms.
  • SystemColorMode.System– Respektera det ljus- eller mörka läge som angetts av Windows.
  • SystemColorMode.Dark– Använd mörkt läge.

Om du vill använda ett färgläge anropar du Application.SetColorMode(SystemColorMode) i programmets startkod:

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

Det här API:et är skyddat bakom ett kompilatorfel eftersom det är experimentellt. Om du vill förhindra felet och aktivera åtkomst till API:et lägger du till följande PropertyGroup i projektfilen:

<PropertyGroup>
    <NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>

Dricks

Mer information om hur du utelämnar den här regeln finns i Compiler Error WFO5001.

Förbättringar av FolderBrowserDialog

FolderBrowserDialog stöder nu val av flera mappar som lagras i SelectedPaths matris. Om du vill aktivera flera mappar anger du Multiselect till true.

System.Drawing de nya funktionerna och förbättringarna

Biblioteket System.Drawing har haft många förbättringar, inklusive omslutning av GDI+-effekter, stöd för ReadOnlySpanoch bättre interop-kodgenerering.

System.Drawing har stöd för GDI+-effekter

Biblioteket System.Drawing stöder nu GDI+ bitmappseffekter, till exempel oskärpa och färgton. Effekterna har varit en del av GDI+, men har inte exponerats via System.Drawing förrän nu.

Effekter tillämpas på en Bitmap genom att anropa metoden Bitmap.ApplyEffect(Effect, Rectangle). Ange effekten och en valfri Rectangle för området att tillämpa effekten på. Använd Rectangle.Empty för att bearbeta hela bilden.

Namnområdet System.Drawing.Imaging.Effects innehåller de effekter som du kan använda:

System.Drawing har stöd för Span

Många metoder som accepterade matriser har förbättrats för att även acceptera ReadOnlySpan. Till exempel accepterar metoder som GraphicsPath.AddLines(ReadOnlySpan<Point>), Graphics.DrawLines(Pen, ReadOnlySpan<Point>)och DrawPolygon(Pen, ReadOnlySpan<Point>)en matris eller ReadOnlySpan.

Använda CsWin32 för interop

All interop-kod har ersatts av CsWin32, en C#P/Invoke-källgenerator.

ToolStrip

Följande förbättringar har lagts till i kontrollerna ToolStrip och ToolStripItem.

  • En ny egenskap har lagts till i ToolStrip, AllowClickThrough.

    När den är inställd på truekan kontrollen interageras med när formuläret är ofokuserat.

När .NET Core 3.1 släpptes togs alla Menu-relaterade kontroller, till exempel MainMenu och MenuItem, bort. ToolStrip och ToolStripMenuItem ska användas i stället. Den basklass som ToolStripItemutgör för ToolStripMenuItemhade dock ingen ersättning för MenuItem.Select-händelsen. Den här händelsen aktiverades när musen eller tangentbordet används för att markera objektet.

.NET 9 har lagt till ToolStripItem.SelectedChanged, som kan användas för att identifiera när ett menyalternativ är markerat.