次の方法で共有


Windows フォーム for .NET 9 の新機能

この記事では、Windows フォーム for .NET 9 の新機能について説明します。

非同期フォーム

重要

この機能セットは、Control.InvokeAsyncを除いて試験段階です。

最新のアプリには非同期通信モデルが必要です。 .NET でWindows フォームが拡大するにつれて、UI スレッドで実行するために、async メソッドへのマーシャリングが必要なコンポーネントが増えています。 たとえば、 WebView2、ネイティブ Windows 10 および Windows 11 API、 Semantic Kernel などの最新の非同期ライブラリなどのコントロール。 もう 1 つのシナリオは、WPF、WinUI、.NET MAUI などの他の UI スタックからWindows フォームasyncを中心に構築された MVVM ViewModel を共有する場合です。

非同期シナリオをサポートするために追加された新しいメソッドの一覧を次に示します。

この API は試験的であるため、コンパイラ エラーの背後で保護されます。 エラーを抑制し、API へのアクセスを有効にするには、次の PropertyGroup をプロジェクト ファイルに追加します。

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

ヒント

このルールを抑制する方法の詳細については、「 Compiler エラー WFO5002」を参照してください。

BinaryFormatter がサポートされなくなりました

BinaryFormatter は、逆シリアル化攻撃に対して脆弱であり、サービス拒否 (DoS)、情報漏えい、またはリモート コード実行につながる可能性があるため、安全でないと見なされます。 逆シリアル化の脆弱性がよく理解される前に実装されており、その設計は最新のセキュリティのベスト プラクティスに従っていません。

.NET 9 以降では、これらのセキュリティ リスクを防ぐために実装が削除されました。 BinaryFormatterを使用すると、PlatformNotSupportedException例外がスローされます。

Windows フォームクリップボードやドラッグ アンド ドロップ操作のデータをシリアル化する場合や、最も重要なのはWindows フォーム デザイナーなど、多くのシナリオでBinaryFormatter使用されます。 内部的には、Windows フォームは、既知の種類のセットを持つ特定のユース ケースを処理するために、BinaryFormatterのより安全なサブセットを引き続き使用します。

.NET 9 のWindows フォームには、知らないうちにバイナリ シリアル化に参加する時間を特定するのに役立つアナライザーが付属しています。

BinaryFormatterの詳細については、BinaryFormatter の移行ガイドWindows フォーム参照

ダーク モード

重要

この機能セットは試験段階です。

.NET 10 でのサポートの最終決定を目的として、ダーク モードの予備的なサポートがWindows フォームに追加されました。 カラー モードが変更されると、 SystemColors が一致するように変更されます。 アプリのカラー モードは、次のいずれかの値に設定できます。

  • SystemColorMode.Classic—(既定) ライト モード。以前のバージョンのWindows フォームと同じです。
  • 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>

ヒント

このルールを抑制する方法の詳細については、「 Compiler エラー WFO5001」を参照してください。

FolderBrowserDialog の機能強化

FolderBrowserDialog では、 SelectedPaths 配列に格納されている複数のフォルダーの選択がサポートされるようになりました。 複数のフォルダーを有効にするには、 Multiselecttrue に設定します。

System.Drawing の新機能と機能強化

System.Drawing ライブラリには、GDI+ 効果のラップ、ReadOnlySpanのサポート、相互運用コードの生成の向上など、多くの機能強化が行われました。

System.Drawing では GDI+ 効果がサポートされます

System.Drawing ライブラリで、ぼかしや濃淡などの GDI+ ビットマップ効果がサポートされるようになりました。 効果は GDI+ の一部でしたが、これまで System.Drawing によって公開されませんでした。

効果は、Bitmap メソッドを呼び出すことによってBitmap.ApplyEffect(Effect, Rectangle)に適用されます。 効果を適用する領域の効果とオプションの Rectangle を指定します。 Rectangle.Emptyを使用してイメージ全体を処理します。

System.Drawing.Imaging.Effects名前空間には、適用できる効果が含まれています。

System.Drawing ではスパンがサポートされます

配列を受け入れる多くのメソッドは、 ReadOnlySpanも受け入れるように拡張されています。 たとえば、 GraphicsPath.AddLines(ReadOnlySpan<Point>)Graphics.DrawLines(Pen, ReadOnlySpan<Point>)DrawPolygon(Pen, ReadOnlySpan<Point>)などのメソッドは、配列または ReadOnlySpanを受け入れます。

相互運用に CsWin32 を使用する

すべての相互運用コードは、C# P/Invoke ソース ジェネレーターである CsWin32 に置き換えられました。

ToolStrip

ToolStripコントロールとToolStripItem コントロールに次の機能強化が追加されました。

  • ToolStripAllowClickThroughに新しいプロパティが追加されました。

    trueに設定すると、フォームがフォーカスされていない間にコントロールを操作できます。

.NET Core 3.1 がリリースされたとき、MenuMainMenuなど、MenuItem関連のすべてのコントロールが削除されました。 ToolStrip 代わりに、 ToolStripMenuItem を使用する必要があります。 ただし、ToolStripItemの基底クラスであるToolStripMenuItemは、MenuItem.Select イベントに代わるものはありませんでした。 このイベントは、マウスまたはキーボードを使用して項目を強調表示するときに発生しました。

.NET 9 には ToolStripItem.SelectedChangedが追加されました。メニュー項目が強調表示されていることを検出するために使用できます。