.NET 11 Preview のWindows フォームの新機能

この記事では、.NET 11 Preview の Windows フォーム (WinForms) の新機能の概要について説明します。 詳細については、「 リリースのお知らせ」を参照してください。 リリースのお知らせを使用して、.NET 11 リリース全体の概要を確認します。 この記事の残りの部分では、Windows フォームに対する最も重要な変更について説明します。

.NET 11 Preview 7 は 2026 年 8 月にリリースされました。

リリースのお知らせ

各リリースのお知らせでは、.NET 11 のWindows フォームの変更に関する詳細情報が提供されます。

表示スタイルと外観

System.Windows.Forms.Application.SetDefaultVisualStylesMode 新しい System.Windows.Forms.Control.VisualStylesMode プロパティを使用すると、アプリケーションとコントロール レベルで更新されたレンダリング パイプラインを選択できます。 クラシック レンダラー (VisualStylesMode.Classic)、完全にオフになっているビジュアル スタイル (VisualStylesMode.Disabled)、モダン レンダラー (VisualStylesMode.Net11) のいずれかを選択します。 VisualStylesMode.Latest は常に、ランタイムでサポートされる中で最も新しいモードに決定されます。 子コントロールの既定値は VisualStylesMode.Inherit です。そのため、設定は親から子へ継承されます。

Net11 モードでは、ButtonCheckBoxRadioButtonGroupBoxTextBox、およびRichTextBoxの最新化されたレンダリングが提供されます。 ボタンとチェック ボックスの FlatStyle プロパティとテキスト ボックスの BorderStyle プロパティで、レンダリング スタイルを定義します。 プロパティ グリッドでは、テキスト ボックスとリッチ テキスト ボックスに Padding プロパティが公開され、 VisualStylesModeNet11 以降の場合に適用されます。

Control.VisualStylesMode は、 BackColorFontに似たアンビエント プロパティです。 解決処理は親チェーンをさかのぼり、最上位レベルに達すると Application.DefaultVisualStylesMode にフォールスルーします。 Control.GetVisualStylesModeChangeImpactを呼び出して、モードが変更されたときに更新する必要があるかどうかを確認し、Control.EffectiveVisualStylesMode プロパティを使用して継承後に解決された値を取得します。

using System.Windows.Forms;

Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);

Form form = new()
{
  Text = "Modern visual styles",
  VisualStylesMode = VisualStylesMode.Latest,
};

ComboBox combo = new() { Dock = DockStyle.Top };
combo.Items.AddRange(["One", "Two", "Three"]);
form.Controls.Add(combo);

Application.Run(form);

システムのビジュアル設定に対応する

System.Windows.Forms.Application.SystemVisualSettings では、アクセント カラー、ハイ コントラスト状態、キーボード キューの可視性、クライアント領域のアニメーション設定、フォーカス境界メトリック、テキスト スケール ファクターが 1 つのスナップショットとして公開されます。 新しい System.Windows.Forms.Application.SystemVisualSettingsChanged イベントは、これらのカテゴリのいずれかが変更されるたびに発生するため、すべての通知でテーマ リソースを再構築するのではなく、影響を受ける UI のみを更新できます。 System.Windows.Forms.SystemVisualSettingsChangedEventArgs.Changed は、変更されたカテゴリを示す SystemVisualSettingsCategories フラグ値です。 コントロールは、 OnSystemVisualSettingsChanged をオーバーライドしてローカルに応答できます。

using System.Drawing;
using System.Windows.Forms;

Application.SystemVisualSettingsChanged += (sender, e) =>
{
  if ((e.Changed & SystemVisualSettingsCategories.AccentColor) != 0)
  {
    Color accent = e.NewSettings.AccentColor;
    Console.WriteLine($"Accent color changed to {accent}.");
  }

  if ((e.Changed & SystemVisualSettingsCategories.TextScale) != 0)
  {
    Console.WriteLine($"Text scale is now {e.NewSettings.TextScaleFactor:P0}.");
  }
};

遅延フォームの表示

System.Windows.Forms.FormRevealMode は、起動時にフォームが表示されるタイミングをアプリケーションが制御できるようにします。 FormRevealMode.Deferred フォームが最初に表示された後にダーク モードまたは新しいビジュアル スタイルが適用されたときに、スタイルが設定されていないウィンドウの短いフラッシュを回避して、最初のレイアウトとテーマが解決するまでフォームを隠し続けます。 FormRevealMode.Classic は既存の show-immediately 動作を保持し、 FormRevealMode.InheritApplication.SetDefaultFormRevealModeで設定された値に従います。 Application.IsFormRevealDeferredを呼び出して解決済みの状態を取得し、値が変更されたときにForm.FormRevealModeChanged イベントを処理します。

using System.Windows.Forms;

Application.SetDefaultVisualStylesMode(VisualStylesMode.Net11);
Application.SetDefaultFormRevealMode(FormRevealMode.Deferred);

Form form = new() { Text = "No unstyled flash on startup" };
Application.Run(form);

一括変更中に塗りつぶしを停止する

新しい System.Windows.Forms.ISupportSuspendPainting インターフェイスと ControlMutationExtensions.SuspendPainting 拡張メソッドは、 BeginUpdate/EndUpdateSuspendLayout/ResumeLayout を 1 つの IDisposable スコープに結合します。 LayoutSuspendTraversal は、中断がターゲットのみに適用されるか、ターゲットとそのすべての子孫に適用されるかを制御します。 この方法は、自動サイズ設定を使用して入れ子になった TableLayoutPanel コンテナーに変更を適用する場合に便利です。この方法では、停止によってレイアウトの嵐やちらつきが防止されます。

ComboBoxListBoxListViewRichTextBox、および TreeView は、 ISupportSuspendPaintingを実装するようになりました。 確立された中断パターン (BeginUpdate/EndUpdate) を新しいインターフェイス経由でルーティングするため、一括編集では、複数のペア呼び出しを管理することなくちらつきを回避できます。 その他のすべてのコントロールでは、中断動作は新しい動作です。

using System.Windows.Forms;

ListBox list = new();

using (list.SuspendPainting(LayoutSuspendTraversal.Target))
{
  for (int i = 0; i < 10_000; i++)
  {
    list.Items.Add($"Item {i}");
  }
}

CheckBox および RadioButton のトグル スイッチの外観

System.Windows.Forms.Appearance.ToggleSwitchは、コントロールをスイッチとしてCheckBox.Appearanceの下にレンダリングするVisualStylesMode.Net11の新しい値です。 既存の CheckedCheckedChanged、データ バインディングの動作は変更されないため、 CheckBox を新しい外観に切り替えるときにコードを更新する必要はありません。 破壊的変更を発生させずに、最新の UI 規則に合わせてチェック ボックス コントロールを最新化できます。

using System.Windows.Forms;

CheckBox toggle = new()
{
  Text = "Enable notifications",
  Appearance = Appearance.ToggleSwitch,
  Checked = true,
};

Important

Visual Styles および関連する新しい API のレンダリング動作はまだ最終段階ではなく、.NET 11 が GA に達するまで変化し続けます。 探索的テストと顧客からのフィードバックに基づくと、クラシック以外の Visual Style 設定を使用するコントロールは、Preview 7 と比べて、今後の .NET 11 リリース(RC、GA)では占有する領域が広くなる場合も狭くなる場合もあります。 新しい API の動作も同様に、詳細または特定のシナリオで変化する可能性があります。

このため、これらの機能を採用する場合は、ピクセル完璧な設計を避けてください。 TableLayoutPanelFlowLayoutPanelを使用してレイアウト ベースのアプローチを優先します。これは、制御メトリックの変化に自動的に適応します。

クリップボード

  • Clipboard.GetText TextDataFormat.Rtfでは、NULL ターミネータを含まない RTF クリップボード データが正しく読み取られます。 この修正により、PowerPoint などのアプリケーションからコピーされた有効な RTF コンテンツが空文字列を返す問題が解決されます。

  • GetDataObject() は、クリップボードに配置されたビットマップ データを格納できる IDataObject を返し、そのデータ オブジェクトからビットマップ イメージ GetImage() 取得します。 GetImage() また、クリップボードから直接イメージを取得します。 GetImage() では、 TryGetData<Image>(DataFormats.Bitmap, autoConvert: true, ...) を呼び出して型指定されたクリップボード パイプラインを介してイメージを取得し、イメージを取得できない場合は null を返します。

    次のコードは、 bitmap が既存の Bitmap であり、返されたデータ オブジェクトを介してイメージを取得する場合に、ビットマップ イメージをラウンドトリップするようになりました。

    // Round-trips again on .NET 11
    Clipboard.SetImage(bitmap);
    Image? image = Clipboard.GetDataObject()?.GetImage();
    

ツールストリップ

  • ToolStripDropDown フォーカスの変更中にモーダル メニューの追跡が保持されるようになりました。そのため、ユーザーがタブ ページを切り替えたり、他のコントロールにフォーカスを移動したりすると、SmartTag とドロップダウン UI が正常に閉じます。 これにより、ドロップダウンが不適切に開いたままになる回帰が修正されます。

  • ToolStrip TabStop=trueを使用するコントロールが、タブ ナビゲーション後にメニュー処理を正しくアクティブにしなくなりました。 以前は、この動作により、 TreeView などのコントロールが方向キー入力を受け取れなくなります。

  • ToolStripDropDownMenu スクロールは、範囲外のスクロールや意図しないドロップダウンの閉じ込みが発生することなく、メニューの境界を正しく処理するようになりました。

  • ToolStrip DPI の変更では、DPI 変更パス中に以前のデバイスの DPI が保持されるようになりました。そのため、DPI 設定が異なるディスプレイ間でコントロールを移動すると、スケーリング ロジックが正しく実行されます。

レイアウト

  • AnchorLayoutV2 中断されたレイアウト パス中にアンカー コントロールが置き換えられると、不足しているアンカー メタデータが適切に初期化され、レイアウトの不整合が回避されるようになりました。

デザイナー

  • ホストWindows フォームデザイナーは、CommandSet.OnMenuPaste を使用してコントロールを再び貼り付け、以前に破損していた貼り付け機能を復元できるようになりました。

  • カスタム コントロールのコレクション エディターのキャプションに、生成された ControlProxy<T> ラッパー名ではなく、基になるコントロールの種類が表示されるようになりました。これにより、デザイナーでコントロールを識別しやすくなります。

PropertyGrid

ダーク モード

  • ProgressBar ダーク モードレンダリング用の既定の前景色と背景色が追加され、Fluent をテーマにしたアプリケーションでの視覚的な一貫性が向上しました。

バグの修正

  • Control: SendKeys シーケンシャル即時修飾子の解析 ( ^a^c+a+c%f%tなど) の回帰が修正されました。 ツールヒントのポップアップ イベント中にフォーカスが変更されても、KeyboardToolTipStateMachineKeyNotFoundException を送出しなくなりました。

  • ListBox: IsSynchronized 値が ListBox コレクション全体で正しくなりました。

  • NumericUpDown:ビジュアル スタイルが無効な場合に発生したボタンレンダリングの回帰が修正されました。

  • SplitContainer: コントロールは、RepaintSplitterRectを呼び出すときに、ディスプレイ セッションの遷移中に一時的な GDI+ ExternalExceptionを処理するようになりました。

  • ToolStrip: スクロール時にスクロールダウン ボタンがスローされなくなりました。 不確定でチェックされた ToolStripMenuItem アイコンがダーク モードで表示されるようになりました。

  • PropertyGrid: 高 DPI 環境で LargeButtons を切り替えても、[プロパティ ページ] ボタン アイコンは変わらなくなりました。 ResetHelpForeColor では、背景色ではなく前景色が正しくリセットされるようになりました。

  • PrintPreviewControl: ForeColor 白に設定するとレンダリングが正しくなりました。

  • ダーク モード: ダーク モードLinkLabelコントラストが向上しました。 TabControl 入れ子になった SplitContainer がダーク モードに一致するようになりました。 HelpProvider テキストがダーク モードで表示されるようになりました。 ToolTip SystemColorMode.Darkが設定されているときにダーク モードに切り替わります。