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