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:
- System.Windows.Forms.Form.ShowAsync
- Form.ShowDialogAsync
- TaskDialog.ShowDialogAsync
- Control.InvokeAsync (det här API:et är inte experimentellt.)
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 BinaryFormatter
finns 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 ReadOnlySpan
och 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:
- BlackSaturationCurveEffect
- BlurEffect
- BrightnessContrastEffect
- ColorBalanceEffect
- ColorCurveEffect
- ColorLookupTableEffect
- ColorMatrixEffect
- ContrastCurveEffect
- CurveChannel
- DensityCurveEffect
- ExposureCurveEffect
- GrayScaleEffect
- HighlightCurveEffect
- InvertEffect
- LevelsEffect
- MidtoneCurveEffect
- ShadowCurveEffect
- SharpenEffect
- TintEffect
- VividEffect
- WhiteSaturationCurveEffect
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å
true
kan 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 ToolStripItem
utgör för ToolStripMenuItem
hade 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.
.NET Desktop feedback