Bagikan melalui


Apa yang baru dalam Formulir Windows untuk .NET 9

Artikel ini menjelaskan apa yang baru dalam Formulir Windows untuk .NET 9.

Formulir asinkron

Penting

Set fitur ini bersifat eksperimental, kecuali untuk Control.InvokeAsync.

Aplikasi modern memerlukan model komunikasi asinkron. Karena Formulir Windows telah berkembang di .NET, lebih banyak komponen memerlukan marshaling ke async metode untuk berjalan pada UI-thread. Misalnya, kontrol seperti WebView2, API Windows 10 dan Windows 11 asli, atau pustaka asinkron modern seperti Semantic Kernel. Skenario lain adalah tempat Anda berbagi MVVM ViewModels yang dibangun dengan async Formulir Windows dari tumpukan UI lain seperti WPF, WinUI, atau .NET MAUI.

Berikut ini daftar metode baru yang ditambahkan untuk mendukung skenario asinkron:

API ini dijaga di balik kesalahan kompilator karena bersifat eksperimental. Untuk menekan kesalahan dan mengaktifkan akses ke API, tambahkan yang berikut ini PropertyGroup ke file proyek Anda:

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

Tip

Untuk informasi selengkapnya tentang cara menyembunyikan aturan ini, lihat WFO5002 Kesalahan Pengompilasi.

BinaryFormatter tidak lagi didukung

BinaryFormatter dianggap tidak aman karena rentan terhadap serangan deserialisasi, yang dapat menyebabkan penolakan layanan (DoS), pengungkapan informasi, atau eksekusi kode jarak jauh. Ini diterapkan sebelum kerentanan deserialisasi dipahami dengan baik, dan desainnya tidak mengikuti praktik terbaik keamanan modern.

Dimulai dengan .NET 9, implementasinya telah dihapus untuk mencegah risiko keamanan ini. Ketika BinaryFormatter digunakan, PlatformNotSupportedException pengecualian dilemparkan.

Formulir Windows digunakan BinaryFormatter dalam banyak skenario, seperti saat menserialisasikan data untuk operasi clipboard dan seret dan letakkan, dan yang paling penting, Formulir Windows Designer. Secara internal, Formulir Windows terus menggunakan subset BinaryFormatter yang lebih aman untuk menangani kasus penggunaan tertentu dengan sekumpulan jenis yang diketahui.

Formulir Windows untuk .NET 9 dikirim dengan penganalisis yang membantu Anda mengidentifikasi waktu Anda secara tidak sadar berpartisipasi dalam serialisasi biner.

Untuk informasi selengkapnya tentang BinaryFormatter, lihat panduan migrasi Formulir Windows untuk BinaryFormatter.

Mode gelap

Penting

Set fitur ini bersifat eksperimental.

Dukungan awal untuk mode gelap telah ditambahkan ke Formulir Windows, dengan tujuan menyelesaikan dukungan di .NET 10. Saat mode warna berubah, SystemColors diubah agar cocok. Mode warna untuk aplikasi dapat diatur ke salah satu nilai berikut:

  • SystemColorMode.Classic—(default) Mode cahaya, sama dengan versi Formulir Windows sebelumnya.
  • SystemColorMode.System—Hormati mode terang atau gelap yang diatur oleh Windows.
  • SystemColorMode.Dark—Gunakan mode gelap.

Untuk menerapkan mode warna, panggil Application.SetColorMode(SystemColorMode) kode startup program:

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 ini dijaga di balik kesalahan kompilator karena bersifat eksperimental. Untuk menekan kesalahan dan mengaktifkan akses ke API, tambahkan yang berikut ini PropertyGroup ke file proyek Anda:

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

Tip

Untuk informasi selengkapnya tentang cara menyembunyikan aturan ini, lihat WFO5001 Kesalahan Pengompilasi.

Peningkatan FolderBrowserDialog

FolderBrowserDialog sekarang mendukung pemilihan beberapa folder, yang disimpan dalam SelectedPaths array. Untuk mengaktifkan beberapa folder, atur Multiselect ke true.

System.Drawing fitur dan penyempurnaan baru

Pustaka System.Drawing telah memiliki banyak peningkatan, termasuk membungkus efek GDI+, dukungan untuk ReadOnlySpan, dan pembuatan kode interop yang lebih baik.

System.Drawing mendukung efek GDI+

Pustaka System.Drawing sekarang mendukung efek bitmap GDI+, seperti blur dan tint. Efek telah menjadi bagian dari GDI+, tetapi tidak diekspos melalui System.Drawing sampai sekarang.

Efek diterapkan ke dengan Bitmap memanggil Bitmap.ApplyEffect(Effect, Rectangle) metode . Berikan efek dan opsional Rectangle bagi area untuk menerapkan efeknya. Gunakan Rectangle.Empty untuk memproses seluruh gambar.

Namespace System.Drawing.Imaging.Effects berisi efek yang dapat Anda terapkan:

System.Drawing mendukung Rentang

Banyak metode yang menerima array telah ditingkatkan untuk juga menerima ReadOnlySpan. Misalnya, metode seperti GraphicsPath.AddLines(ReadOnlySpan<Point>), , Graphics.DrawLines(Pen, ReadOnlySpan<Point>)dan DrawPolygon(Pen, ReadOnlySpan<Point>), menerima array atau ReadOnlySpan.

Menggunakan CsWin32 untuk interop

Semua kode interop telah digantikan oleh CsWin32, generator sumber C# P/Invoke.

ToolStrip

Penyempurnaan berikut telah ditambahkan ke ToolStrip kontrol dan ToolStripItem .

  • Properti baru ditambahkan ke ToolStrip, AllowClickThrough.

    Ketika diatur ke true, kontrol dapat berinteraksi saat formulir tidak fokus.

Kembali ketika .NET Core 3.1 dirilis, semua Menukontrol terkait, seperti MainMenu dan MenuItem, dihapus. ToolStrip dan ToolStripMenuItem harus digunakan sebagai gantinya. Namun, ToolStripItem, kelas dasar untuk ToolStripMenuItem, tidak memiliki penggantian untuk peristiwa tersebut MenuItem.Select . Kejadian ini dinaikkan ketika tetikus atau papan tombol digunakan untuk menyoroti item.

.NET 9 telah menambahkan ToolStripItem.SelectedChanged, yang dapat digunakan untuk mendeteksi kapan item menu disorot.