次の方法で共有


.NET 8 用の新機能 (Windows フォーム .NET)

この記事では、.NET 8 での Windows フォームの新しい機能と拡張機能についていくつか説明します。

.NET Framework から .NET 8 に移行するときに注意する必要がある破壊的変更がいくつかあります。 詳細については、Windows フォームでの破壊的変更に関するページを参照してください。

データ バインディングの改善

新しいデータ バインディング エンジンは .NET 7 でプレビュー段階でしたが .NET 8 で完全に有効になりました。 既存の Windows フォーム データ バインディング エンジンほど広範ではありませんが、この新しいエンジンは WPF をモデル化しているため、MVVM の設計原則を簡単に実装できます。

強化されたデータ バインディング機能により、MVVM パターンを完全に利用し、Windows フォームの ViewModels からオブジェクトリレーショナル マッパーを使用する方が簡単になります。 これにより、分離コード ファイル内のコードの量が減ります。 さらに重要なのは、Windows フォームと他の .NET GUI フレームワーク (WPF、UWP/WinUI、.NET MAUI など) 間でコードを共有できるようになることです。 前に説明した GUI フレームワークでは UI テクノロジとして XAML が使用されていますが、XAML は Windows フォームには含まれないことに注意してください。

IBindableComponent インターフェイスと BindableComponent クラスによって、新しいバインディング システムが駆動されます。 Control はインターフェイスを実装し、Windows フォームに新しいデータ バインディング機能を提供します。

ボタン コマンド

ボタン コマンドは .NET 7 でプレビュー段階でしたが、.NET 8 で完全に有効になりました。 WPF と同様に、ICommand インターフェイスを実装するオブジェクトのインスタンスをボタンの Command プロパティに割り当てることができます。 ボタンがクリックされると、コマンドが呼び出されます。

オプションのパラメーターは、コマンドが呼び出されたときに、ボタンの CommandParameter プロパティの値を指定することによって指定できます。

次のイメージに示すように、Command プロパティと CommandParameter プロパティは、デザイナーの [プロパティ] ウィンドウの [(DataBindings)] で設定します。

The Visual Studio properties window highlighting a Windows Forms' Button's Command and CommandParameter properties.

また、ボタンは ICommand.CanExecuteChanged イベントをリッスンするため、コントロールは ICommand.CanExecute メソッドに対してクエリを実行します。 そのメソッドから true が返されると、コントロールは有効になります。false が返されるとコントロールが無効になります。

Visual Studio の DPI の機能強化

Visual Studio 2022 17.8 DPI では、DPI 非対応のデザイナー タブが導入されています。 以前は、Visual Studio の [Windows デザイナー] タブが Visual Studio の DPI で実行されました。 これにより、DPI 非対応の Windows フォーム アプリを設計するときに問題が発生します。 これで、アプリを実行する場合と同じスケールでデザイナーを実行できます (DPI 対応でも、DPI 非対応でも)。 この機能が導入される前は、DPI 非対応モードで Visual Studio を実行する必要がありました。これにより、Windows でスケーリングが適用されたときに Visual Studio 自体がぼやけました。 Visual Studio をそのままにして、デザイナーで DPI 対応を実行させることができるようになりました。

Windows フォーム プロジェクトの DPI 非対応デザイナーを有効にするには、プロジェクト ファイルに <ForceDesignerDPIUnaware> を追加し、値を true に設定します。

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net8.0-windows</TargetFramework>
  <Nullable>enable</Nullable>
  <UseWindowsForms>true</UseWindowsForms>
  <ImplicitUsings>enable</ImplicitUsings>
  <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  <ApplicationHighDpiMode>DpiUnawareGdiScaled</ApplicationHighDpiMode>
</PropertyGroup>

重要

Visual Studio では、プロジェクトが読み込まれるときにこの設定が読み取られ、変更されたときは読み込まれません。 この設定を変更した後、プロジェクトをアンロードして再読み込みし、Visual Studio でプロジェクトを尊重します。

高 DPI の機能強化

PerMonitorV2 を使用した高 DPI レンダリングが次のように改良されました。

  • 入れ子になったコントロールを正しくスケーリングします。 たとえば、タブ ページに配置されているパネル内のボタンなどです。

  • 現在のモニター DPI の設定に基づいて、Form.MaximumSizeForm.MinimumSize プロパティをスケーリングします。

    .NET 8 以降では、この機能は既定で有効になっており、以前の動作に戻すにはオプトアウトする必要があります。

    この機能を無効にするには、runtimeconfig.jsonconfigProperties 設定に System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi を追加し、値を false に設定します。

    {
      "runtimeOptions": {
        "tfm": "net8.0",
        "frameworks": [
            ...
        ],
        "configProperties": {
          "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": false,
        }
      }
    }
    

その他の機能強化

その他に、次のような重要な変更があります。

  • FolderBrowserDialog を処理したコードが改善され、いくつかのメモリ リークが修正されました。
  • Windows フォームのコード ベースでは、C# の NULL 値の許容が徐々に有効になり、潜在的な null 参照エラーが根絶されています。
  • System.Drawing ソース コードは、Windows フォーム GitHub リポジトリに移行されました。
  • 最新の Windows アイコンは、 新しい API である System.Drawing.SystemIcons.GetStockIcon によってアクセスできます。 System.Drawing.StockIconId 列挙体には、使用可能なすべてのシステム アイコンが一覧表示されます。
  • その他のデザイナーも実行時に使用できるようになりました。 詳細については、GitHub の問題 #4908 を参照してください。