single.php

C# WinUI 3アプリでダークモードのイベントでタイトルバーを変更する手順

C# WinUI 3アプリを作っていく途中で、躓いた部分を備忘録的に投稿します。今回はWindows11の[モードを選ぶ]設定でタイトルバーの色を変更する手順です。

Windows11のダークモード設定

Windows11の場合、[個人用設定|色]画面に設定する項目があります。

タイトルバーやウィンドウなど画面が黒系を基調にした「ダーク」と「ライト」を切り替えることができます。

設定画面では「カスタム」を含めた3つのモードを選ぶことができます。Google Chromeなど対応しているアプリであれば設定に合わせて画面の配色が変更されるようになります。

C#からこの「モード」設定を取得する詳しい内容に興味のある方は別記事をご覧ください。

SystemEventsアセンブリから取得

NuGetで取得できる「Microsoft.Win32.SystemEvents」アセンブリがあります。

もちろん、WinUI3プロジェクトに追加もできます。

しかし、次のようなコードを追加しても

Microsoft.Win32.SystemEvents.UserPreferenceChanging += UserPreferenceChanging;

private void UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{

  //ユーザー設定変更時の処理
}

WinUI3プロジェクトではアプリの実行時にイベントを取得することができません。

Xaml上のコントロールから取得

そこで考えたのが、WinUI 3プロジェクトで自動的にコントロールをモードに調整してくれるコントロール(ボタンなど)から取得する方法。

Xaml上のコントロール(下の画像ではButton)の属性に[ActualThemeChanged]を追加します。

<Button ActualThemeChanged="ActualThemeChanged"></Button>

これで、Windowsの[設定|色]画面でモードが変更された際に、ボタンのスタイルが変更されるイベントが[ActualThemeChanged]で発生するようになります。

次に、xaml.csファイルにイベントハンドラーを追加します。

private void ActualThemeChanged(FrameworkElement sender, object e)
{
  var titleBar = m_AppWindow.TitleBar;
  UISettings uiset = new UISettings();
  titleBar.ForegroundColor = uiset.GetColorValue(UIColorType.Foreground);
  titleBar.BackgroundColor = uiset.GetColorValue(UIColorType.Background);
}

これで実行してフォームを表示した状態で

モードを[ライト]から[ダーク]に変更すると、タイトルバーの色も変更されるようになります。

しかし、実行時に[ダーク]の場合には[ActualThemeChanged]イベントが発生しないため、タイトルバーが[ライト]状態になってしまうために、コードを修正します。

新しく[SetTitleBarColor]プロシージャを作成して、[ActualThemeChanged]イベントから呼び出すように修正します。

private void ActualThemeChanged(FrameworkElement sender, object e)
{
  SetTitleBarColor();
}

private void SetTitleBarColor()
{
  var titleBar = m_AppWindow.TitleBar;
  UISettings uiset = new UISettings();
  titleBar.ForegroundColor = uiset.GetColorValue(UIColorType.Foreground);
  titleBar.BackgroundColor = uiset.GetColorValue(UIColorType.Background);
}

あとは、コンストラクター部分にも[SetTitleBarColor]を呼び出すコードを追加することで、初期状態でモードに応じたタイトルバーの配色が可能になります。

public MainWindow()
{
  this.InitializeComponent();

  IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
  Microsoft.UI.WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
  m_AppWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);

  SetTitleBarColor();

}

まとめ

今回は、WinUI 3 アプリでWindows10/11のダークモードを設定変更を取得してタイトルバーの配色を変更する方法を書きました。

WinUI3プロジェクトは、Xamlで作成したコントロールは自動的にモード変更でスタイルが変更されるためレジストリなどで現在の値を取得することなくモード変更時にタイトルバーなどの配色を変更することができます。

C#のWinUI 3アプリでダークモードの変更イベントを取得したい場合の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です