適用於 .NET 9 的 Windows Forms 新功能
本文說明適用於 .NET 9 的 Windows Forms 新功能。
異步表單
重要
這項功能集是實驗性的,但 Control.InvokeAsync
除外。
新式應用程式需要異步通訊模型。 隨著 Windows Forms 在 .NET 上成長,更多元件需要封送處理至 async
在 UI 線程上執行的方法。 例如,WebView2、原生 Windows 10 和 Windows 11 API 之類的控件,或語意核心等新式異步連結庫。 另一個案例是,您要從 WPF、WinUI 或 .NET MAUI 等其他 UI 堆棧共用以 Windows Forms 建 async
置的 MVVM ViewModel。
下列新增至支援異步案例的新方法清單:
- System.Windows.Forms.Form.ShowAsync
- Form.ShowDialogAsync
- TaskDialog.ShowDialogAsync
- Control.InvokeAsync (此 API 不是實驗性。)
此 API 在編譯程式錯誤後方受到防護,因為它是實驗性的。 若要隱藏錯誤並啟用 API 的存取權,請將下列內容 PropertyGroup
新增至您的項目檔:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>
提示
如需如何隱藏此規則的詳細資訊,請參閱 編譯程式錯誤WFO5002。
不再支援 BinaryFormatter
BinaryFormatter
被視為不安全,因為它容易受到還原串行化攻擊,這可能會導致阻斷服務 (DoS)、資訊洩漏或遠端程式代碼執行。 在還原串行化弱點已充分瞭解之前實作,其設計不會遵循新式安全性最佳做法。
從 .NET 9 開始,其實作已移除,以防止這些安全性風險。 使用 時 BinaryFormatter
, PlatformNotSupportedException
會擲回例外狀況。
許多案例中使用的 BinaryFormatter
Windows Forms,例如串行化剪貼簿和拖放作業的數據,最重要的是 Windows Forms 設計工具。 就內部而言,Windows Forms 會繼續使用更安全的 BinaryFormatter
子集來處理具有已知類型的特定使用案例。
適用於 .NET 9 的 Windows Forms 隨附分析器,可協助您識別不知情參與二進位串行化的時間。
如需 的詳細資訊 BinaryFormatter
,請參閱 BinaryFormatter 的 Windows Forms 移轉指南。
深色模式
重要
此功能集是實驗性的。
已將深色模式的初步支援新增至 Windows Forms,目標是在 .NET 10 中完成支援。 當色彩模式變更時, SystemColors 會變更 為相符。 應用程式的色彩模式可以設定為下列其中一個值:
-
SystemColorMode.Classic
—(預設) 淺色模式,與舊版 Windows Forms 相同。 -
SystemColorMode.System
—尊重 Windows 所設定的淺色或深色模式。 -
SystemColorMode.Dark
—使用深色模式。
若要套用色彩模式,請在程式啟動程式代碼中呼叫 Application.SetColorMode(SystemColorMode) :
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
此 API 在編譯程式錯誤後方受到防護,因為它是實驗性的。 若要隱藏錯誤並啟用 API 的存取權,請將下列內容 PropertyGroup
新增至您的項目檔:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5001</NoWarn>
</PropertyGroup>
提示
如需如何隱藏此規則的詳細資訊,請參閱 編譯程式錯誤WFO5001。
FolderBrowserDialog 增強功能
FolderBrowserDialog
現在支持選取儲存在陣列中的 SelectedPaths 多個資料夾。 若要開啟多個資料夾,請將 設定 Multiselect 為 true
。
System.Drawing 新功能和增強功能
System.Drawing 連結庫有許多改進,包括包裝 GDI+ 效果、支援 ReadOnlySpan
和更好的 Interop 程式代碼產生。
System.Drawing 支援 GDI+ 效果
System.Drawing 連結庫現在支援 GDI+ 位圖效果,例如模糊和色調。 效果一直是 GDI+ 的一部分,但直到現在才透過 System.Drawing 公開效果。
效果會藉由呼叫 Bitmap 方法套用至 Bitmap.ApplyEffect(Effect, Rectangle) 。 為要套用效果的區域提供效果和選擇性 Rectangle
專案。 使用 Rectangle.Empty 來處理整個映像。
System.Drawing.Imaging.Effects命名空間包含您可以套用的效果:
- BlackSaturationCurveEffect
- BlurEffect
- BrightnessContrastEffect
- ColorBalanceEffect
- ColorCurveEffect
- ColorLookupTableEffect
- ColorMatrixEffect
- ContrastCurveEffect
- CurveChannel
- DensityCurveEffect
- ExposureCurveEffect
- GrayScaleEffect
- HighlightCurveEffect
- InvertEffect
- LevelsEffect
- MidtoneCurveEffect
- ShadowCurveEffect
- SharpenEffect
- TintEffect
- VividEffect
- WhiteSaturationCurveEffect
System.Drawing 支援 Span
已增強許多已接受陣列的方法,也接受 ReadOnlySpan
。 例如,、、 和GraphicsPath.AddLines(ReadOnlySpan<Point>)等Graphics.DrawLines(Pen, ReadOnlySpan<Point>)DrawPolygon(Pen, ReadOnlySpan<Point>)方法接受陣列或 ReadOnlySpan
。
使用 CsWin32 進行 Interop
所有 Interop 程式代碼已由 C# P/Invoke 來源產生器 CsWin32 取代。
ToolStrip
已將下列改善新增至 ToolStrip 和 ToolStripItem 控件。
新增新屬性到
ToolStrip
、 AllowClickThrough當設定為
true
時,控件可以在窗體未對焦時與其互動。
回到發行 .NET Core 3.1 時,已移除所有相關 Menu
控件,例如 MainMenu
和 MenuItem
。
ToolStrip
應該改用和 ToolStripMenuItem
。 不過, ToolStripItem
的基類 ToolStripMenuItem
沒有 事件的取代 MenuItem.Select
。 當滑鼠或鍵盤用來反白顯示專案時,就會引發這個事件。
.NET 9 已新增 ToolStripItem.SelectedChanged,可用來偵測功能表項反白顯示時間。