是否有一种编程方式来访问系统主题(即Windows的主题)?
类似的问题#UWP get system theme (Light/Dark)
在这里得到了回答:
var DefaultTheme = new Windows.UI.ViewManagement.UISettings();
var uiTheme = DefaultTheme.GetColorValue(Windows.UI.ViewManagement.UIColorType.Background).ToString();
但是正如tipa
评论的那样,被接受的答案建议了一种访问应用程序主题的方法,而不是Windows的主题。
因此,我想知道是否有其他方法访问系统主题。
试试这个:
[DllImport("UXTheme.dll", SetLastError = true, EntryPoint = "#138")]
public static extern bool ShouldSystemUseDarkMode();
如果系统使用暗模式,则返回true。
这不是应用程序的主题。
这是我以前在WPF应用程序中使用的一个方法,用于确定Windows是高对比度还是暗主题。
它已经有一段时间没有更新了,所以它可能过时了,但可能是一个起点?如果需要,您可以轻松地将其调整为仅为light/dark返回enum或bool。
private static string GetWindowsTheme()
{
string RegistryKeyPath = @"SoftwareMicrosoftWindowsCurrentVersionThemesPersonalize";
string RegistryValueName = "AppsUseLightTheme";
if (SystemParameters.HighContrast)
return "High Contrast";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RegistryKeyPath))
{
object registryValueObject = key?.GetValue(RegistryValueName);
if (registryValueObject == null)
return "Default";
int registryValue = (int)registryValueObject;
return registryValue > 0 ? "Default" : "Dark Theme";
}
}
通过在cmd中运行reg query命令作为子进程,可以很容易地完成,而不需要Windows库和SDK:
public static bool IsDarkTheme()
{
try
{
Process process = new();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments =
@"/C reg query HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionThemesPersonalize";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string[] keys = output.Split("rn", StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < keys.Length; i++)
{
if (keys[i].Contains("AppsUseLightTheme"))
{
return keys[i].EndsWith("0");
}
}
}
catch (Exception ex)
{
Debug.LogException(ex);
}
return false;
}
在WinUI 3中,enumApplicationTheme
在Microsoft.UI.Xaml中定义。名称空间。
public enum ApplicationTheme
{
//
// Summary:
// Use the **Light** default theme.
Light,
//
// Summary:
// Use the **Dark** default theme.
Dark
}
你可以得到这样的主题。
public App()
{
this.InitializeComponent();
ApplicationTheme theme = RequestedTheme;
}