C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

C#, XAML: Windows 10 の Ligth/Dark テーマ状態を確認してそれっぽいテーマを採用するアプリにする方法

// Windows のテーマが Light か Dark か取得するヘルパー
using Microsoft.Win32;
namespace usagi.example
{
  static public class ThemeHelper
  {
    const string WindowsThemeRegistryKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
    const string WindowsThemeRegistryValueName = "AppsUseLightTheme";

    public static bool IsWindowsThemeLight
    {
      get
      {
        var key = Registry.CurrentUser.OpenSubKey( WindowsThemeRegistryKeyPath );
        if ( key == null )
          return true;
        var v = (int)key.GetValue( WindowsThemeRegistryValueName );
        return v > 0;
      }
    }
  }
}
// App 起動時に MyLightTheme または MyDarkTheme を適用
namespace usagi.example
{
  public partial class App: Application
  {
    ResourceDictionary RD { get; } = new ResourceDictionary();
    
    App()
    {
      var theme = ThemeHelper.IsWindowsThemeLight ? "MyLightTheme" : "MyDarkTheme";
      RD.Source = new Uri( $"pack://application:,,,/Themes/{ theme }.xaml" );
      Resources.MergedDictionaries.Add( RD );
    }
  }
}
  • MyLightTheme, MyDarkTheme は .xaml を自分で作らなくても NuGet や github で探して適当なテーマを使うと楽。
  • 複数の .xaml に定義が分かれる場合は rd を配列や List にして用意して Resources.MergedDictionaries.Add するとよい。

References

  1. Dark Theme in WPF – RandomEngy's Tech Blog
  2. WPFアプリケーションの外観をWPFテーマで動的に変更するには? - @IT
  3. ResourceDictionary Class (System.Windows) | Microsoft Docs
  4. Registry Class (Microsoft.Win32) | Microsoft Docs