次の方法で共有


.NET 8 対応の Windows Forms の新機能

この記事では、.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)] で設定します。

Windows フォームのボタンの Command プロパティと CommandParameter プロパティが強調表示されている Visual Studio のプロパティ ウィンドウ。

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

Visual Studio の DPI の機能強化

Visual Studio 2022 17.8 は、DPI 非対応のデザイナー タブを導入します。 以前は、Visual Studio の [Windows デザイナー] タブが Visual Studio の DPI で実行されました。 これにより、DPI 非対応の Windows フォーム アプリを設計するときに問題が発生します。 現在は、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 以降では、この機能は既定で有効になっており、以前の動作に戻すにはオプトアウトする必要があります。

    この機能を無効にするには、System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpiconfigProperties 設定に を追加し、値を 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 を参照してください。