英語で読む

次の方法で共有


WPF for .NET 9 の新機能

この記事では、Windows Presentation Foundation (WPF) for .NET 9 の新機能について説明します。 今年の WPF の主な重点領域は、WPF のビジュアル機能を改善し、Windows 11 の Fluent 設計原則に基づいて新しいテーマを提供することでした。

Microsoft Store から WPF ギャラリー アプリをダウンロードして、新しいテーマをプレビューできます

Fluent テーマ

WPF アプリ用の最新の Windows 11 美学を提供する新しいテーマが WPF に含まれています。 これには、統合されたライトモードとダークモード、システムアクセントカラーサポートが含まれています。

  • ライト モードの Fluent テーマ:

    ライト モードの Fluent テーマを示す WPF ギャラリー アプリのスクリーンショット。

  • ダーク モードの Fluent テーマ:

    WPF ギャラリー アプリのスクリーンショット。ダーク モードでの Fluent テーマのデモンストレーション

テーマを適用する

Fluent テーマは、 ThemeMode プロパティを設定するか、Fluent テーマ リソース ディクショナリを参照する 2 つの方法で適用できます。 テーマ モードの設定の詳細については、「 ThemeMode」を参照してください。

Fluent テーマ リソース ディクショナリは、次のパック URI で使用できます: /PresentationFramework.Fluent;component/Themes/Fluent.xaml。 アプリケーション レベルでリソースを適用するには、アプリのリソースにリソースを読み込みます。

XAML
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

リソース ディクショナリは、ウィンドウ自体だけをテーマに Window に適用することもできます。

ThemeMode

新しいスタイル設定 API が WPF に追加されました。これは、 ThemeMode プロパティを介して公開されます。 このプロパティを使用すると、スタイル設定リソース ディクショナリを直接参照しなくても Fluent スタイルを適用できます。

使用可能な値は次のとおりです。

  • Light—淡色の Fluent テーマを適用します。
  • Dark—ダーク Fluent テーマを適用します。
  • System—ユーザーの現在の Windows 設定に基づいて、明るいテーマまたは濃色の Fluent テーマを適用します。
  • None—(既定値) Aero2 テーマを使用します。

アプリケーション全体にテーマ モードを適用するには、ThemeMode型に Application プロパティを設定します。 1 つのウィンドウに適用するには、ThemeModeの種類にWindowを設定します。

たとえば、Windows によって設定されている現在の明るいテーマまたは濃色テーマに基づいて、アプリケーション全体のスタイルを設定します。

C#
<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 によって設定されたテーマに関係なく、ライト テーマを強制する例を次に示します。

C#
<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 要素をプロジェクト ファイルに追加して、エラーを抑制します。

XML
<PropertyGroup>
    <NoWarn>$(NoWarn);WPF0001</NoWarn>
</PropertyGroup>

ヒント

#pragma warning disable WPF0001 ディレクティブを使用すると、プロジェクト全体で無効にするのではなく、発生するエラーを抑制できます。

次に、アプリケーション レベルまたはウィンドウ レベルで ThemeMode プロパティを設定します。

C#
// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;

// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;

Windows アクセント カラーのサポート

Windows 10 では、個人用タッチの提供や特定のビジュアル要素の呼び出しに使用される、ユーザーが選択できるアクセント カラーが導入されました。 WPF では、ユーザーが選択したアクセント カラーがサポートされるようになりました。

ビジュアルの色は、 System.Windows.Media.ColorSystem.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 を次に示します。

XAML
<TextBlock Text="First Name:"
           Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />

ハイフンベースの合字のサポート

WPF では、 TextBlockなどの UI コントロールでハイフンベースの合字がサポートされていません。 この長年のコミュニティの質問は、.NET 9 で追加されました。

.NET 8 のグリフに適用されていない合字の画像を次に示します。

.NET 8 でグリフを合字に結合しない方法を示すテキスト ブロックを含む単純な WPF アプリのスクリーンショット。

そして今、.NET 9でレンダリングされたのと同じテキスト:

.NET 9 でグリフを合字に結合する方法を示すテキスト ブロックを含む単純な WPF アプリのスクリーンショット。

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

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

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

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

BinaryFormatterの詳細については、BinaryFormatter の WPF 移行ガイドを参照してください。