events
WPF for .NET 9 の新機能
この記事では、Windows Presentation Foundation (WPF) for .NET 9 の新機能について説明します。 今年の WPF の主な重点領域は、WPF のビジュアル機能を改善し、Windows 11 の Fluent 設計原則に基づいて新しいテーマを提供することでした。
Microsoft Store から WPF ギャラリー アプリをダウンロードして、新しいテーマをプレビューできます。
WPF アプリ用の最新の Windows 11 美学を提供する新しいテーマが WPF に含まれています。 これには、統合されたライトモードとダークモード、システムアクセントカラーサポートが含まれています。
Fluent テーマは、 ThemeMode
プロパティを設定するか、Fluent テーマ リソース ディクショナリを参照する 2 つの方法で適用できます。 テーマ モードの設定の詳細については、「 ThemeMode」を参照してください。
Fluent テーマ リソース ディクショナリは、次のパック URI で使用できます: /PresentationFramework.Fluent;component/Themes/Fluent.xaml
。 アプリケーション レベルでリソースを適用するには、アプリのリソースにリソースを読み込みます。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
リソース ディクショナリは、ウィンドウ自体だけをテーマに Window
に適用することもできます。
新しいスタイル設定 API が WPF に追加されました。これは、 ThemeMode
プロパティを介して公開されます。 このプロパティを使用すると、スタイル設定リソース ディクショナリを直接参照しなくても Fluent スタイルを適用できます。
使用可能な値は次のとおりです。
Light
—淡色の Fluent テーマを適用します。Dark
—ダーク Fluent テーマを適用します。System
—ユーザーの現在の Windows 設定に基づいて、明るいテーマまたは濃色の Fluent テーマを適用します。None
—(既定値) Aero2 テーマを使用します。
アプリケーション全体にテーマ モードを適用するには、ThemeMode
型に Application
プロパティを設定します。 1 つのウィンドウに適用するには、ThemeMode
の種類にWindow
を設定します。
たとえば、Windows によって設定されている現在の明るいテーマまたは濃色テーマに基づいて、アプリケーション全体のスタイルを設定します。
<Application x:Class="MyWpfProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWpfProject"
StartupUri="MainWindow.xaml"
ThemeMode="System">
Windows によって設定されたテーマに関係なく、ライト テーマを強制する例を次に示します。
<Window x:Class="MyWpfProject.LightWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWpfProject"
Title="LightWindow" Height="450" Width="800"
ThemeMode="Light">
ThemeMode
がアプリケーション レベルでNone
以外の値に設定されている場合、None
はウィンドウ レベルで適用できなくなります。
ThemeMode
は Fluent Dictionary によって設定された設定を尊重するように設計されており、Fluent テーマをカスタマイズできます。
コードでの ThemeMode
の設定の変更のサポートは、現在試験段階の機能です。 コード内の ThemeMode
プロパティにアクセスすると、エラー WPF0001が生成され、API にアクセスできなくなります。 API にアクセスするためのエラーを抑制します。
警告
この API は試験段階であり、変更される可能性があります。
まず、次の PropertyGroup
要素をプロジェクト ファイルに追加して、エラーを抑制します。
<PropertyGroup>
<NoWarn>$(NoWarn);WPF0001</NoWarn>
</PropertyGroup>
ヒント
#pragma warning disable WPF0001
ディレクティブを使用すると、プロジェクト全体で無効にするのではなく、発生するエラーを抑制できます。
次に、アプリケーション レベルまたはウィンドウ レベルで ThemeMode
プロパティを設定します。
// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;
// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;
Windows 10 では、個人用タッチの提供や特定のビジュアル要素の呼び出しに使用される、ユーザーが選択できるアクセント カラーが導入されました。 WPF では、ユーザーが選択したアクセント カラーがサポートされるようになりました。
ビジュアルの色は、 System.Windows.Media.Color
、 System.Windows.Media.SolidColorBrush
、または System.Windows.ResourceKey
として使用できます。 色自体に加えて、アクセントカラーの明るい色合いと暗い色合いを使用できます。 これらは、 System.Windows.SystemColors
を介してアクセスされます。
色 | カラー リソース キー | Brush | Brush リソース キー | |
---|---|---|---|---|
訛り | AccentColor |
AccentColorKey |
AccentColorBrush |
AccentColorBrushKey |
ライト 1 | AccentColorLight1 |
AccentColorLight1Key |
AccentColorLight1Brush |
AccentColorLight1BrushKey |
ライト 2 | AccentColorLight2 |
AccentColorLight2Key |
AccentColorLight2Brush |
AccentColorLight2BrushKey |
ライト 3 | AccentColorLight3 |
AccentColorLight3Key |
AccentColorLight3Brush |
AccentColorLight3BrushKey |
濃色 1 | AccentColorDark1 |
AccentColorDark1Key |
AccentColorDark1Brush |
AccentColorDark1BrushKey |
濃色 2 | AccentColorDark2 |
AccentColorDark2Key |
AccentColorDark2Brush |
AccentColorDark2BrushKey |
濃色 3 | AccentColorDark3 |
AccentColorDark3Key |
AccentColorDark3Brush |
AccentColorDark3BrushKey |
重要
アクセント カラーは、Fluent テーマの有無に関係なく使用できます。
アクセント カラーを使用する UI を作成する場合は、リソース キーを動的リソースでラップします。 アプリを開いている間にユーザーがアクセントカラーを変更すると、アプリで色が自動的に更新されます。 たとえば、前景色をユーザーが選択したアクセント カラーに設定した TextBlock
を次に示します。
<TextBlock Text="First Name:"
Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />
WPF では、 TextBlock
などの UI コントロールでハイフンベースの合字がサポートされていません。 この長年のコミュニティの質問は、.NET 9 で追加されました。
.NET 8 のグリフに適用されていない合字の画像を次に示します。
そして今、.NET 9でレンダリングされたのと同じテキスト:
BinaryFormatter
は、逆シリアル化攻撃に対して脆弱であり、サービス拒否 (DoS)、情報漏えい、またはリモート コード実行につながる可能性があるため、安全でないと見なされます。 逆シリアル化の脆弱性がよく理解される前に実装されており、その設計は最新のセキュリティのベスト プラクティスに従っていません。
.NET 9 以降では、これらのセキュリティ リスクを防ぐために実装が削除されました。 BinaryFormatter
を使用すると、PlatformNotSupportedException
例外がスローされます。
WPF は、クリップボードやドラッグ アンド ドロップ操作のデータをシリアル化する場合など、多くのシナリオで BinaryFormatter
を使用しました。 内部的には、WPF は、既知の種類のセットを使用して特定のユース ケースを処理するために、 BinaryFormatter
のより安全なサブセットを引き続き使用します。
BinaryFormatter
の詳細については、BinaryFormatter の WPF 移行ガイドを参照してください。
.NET Desktop feedback に関するフィードバック
.NET Desktop feedback はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。
その他のリソース
トレーニング
モジュール
Windows 開発プロジェクトに最適なアプリケーション フレームワークを選ぶ - Training
Windows 開発者には、Windows で実行されるアプリケーションを作成するためのさまざまなオプションがあります。 このモジュールでは、Windows 開発に使用できる Windows UI フレームワークを紹介します。 また、アプリケーションに最適なフレームワークを選ぶ方法に関するガイダンスも提供します。