Add Acrylic and Tabbed backdrop
build / build (push) Has been cancelled
build / publish (push) Has been cancelled

This commit is contained in:
ema
2026-04-03 00:31:19 +08:00
parent 75bd49a233
commit 98ec2ce4ac
3 changed files with 149 additions and 24 deletions
+17 -2
View File
@@ -168,7 +168,7 @@ public static class WindowHelper
Marshal.FreeHGlobal(accentPtr);
}
public static void DisableBlur(Window window)
public static void DisableDwmBlur(Window window)
{
var accent = new AccentPolicy();
var accentStructSize = Marshal.SizeOf(accent);
@@ -211,6 +211,11 @@ public static class WindowHelper
var hwnd = new WindowInteropHelper(window).Handle;
if (!window.AllowsTransparency && HwndSource.FromHwnd(hwnd) is HwndSource hwndSource)
{
hwndSource.CompositionTarget.BackgroundColor = Colors.Transparent;
}
var isDarkThemeInt = isDarkTheme ? 1 : 0;
Dwmapi.DwmSetWindowAttribute(hwnd, (uint)Dwmapi.WindowAttribute.UseImmersiveDarkMode, ref isDarkThemeInt, Marshal.SizeOf(typeof(bool)));
@@ -228,7 +233,17 @@ public static class WindowHelper
public static void EnableBackdropMicaBlur(Window window, bool isDarkTheme)
{
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.MainWindow);
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.Mica);
}
public static void EnableBackdropAcrylicBlur(Window window, bool isDarkTheme)
{
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.Acrylic);
}
public static void EnableBackdropTabbedBlur(Window window, bool isDarkTheme)
{
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.Tabbed);
}
[StructLayout(LayoutKind.Sequential)]
+6 -3
View File
@@ -41,9 +41,12 @@ public static class Dwmapi
{
Auto = 0,
None = 1,
MainWindow = 2,
TransientWindow = 3,
TabbedWindow = 4,
Mica = 2,
Acrylic = 3, // Automatically selects the best Acrylic effect available on the system (Acrylic11 > Acrylic10)
Tabbed = 4,
Acrylic10, // Windows 10 style, supported on Windows 10 and 11
Acrylic11, // Windows 11 style, supported on Windows 11 22523+ (Insider) and 22621+ (Stable)
}
[DllImport("DwmApi.dll")]
+126 -19
View File
@@ -27,6 +27,7 @@ using System.Windows.Input;
using System.Windows.Media.Animation;
using System.Windows.Shell;
using Wpf.Ui.Violeta.Controls;
using static QuickLook.Common.NativeMethods.Dwmapi;
using Brush = System.Windows.Media.Brush;
using FontFamily = System.Windows.Media.FontFamily;
using Size = System.Windows.Size;
@@ -157,6 +158,12 @@ public partial class ViewerWindow : Window
base.Close();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
ApplyWindowBackgroundEffects();
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
@@ -171,31 +178,14 @@ public partial class ViewerWindow : Window
var useTransparency = SettingHelper.Get("UseTransparency", true)
&& SystemParameters.IsGlassEnabled
&& !App.IsGPUInBlacklist;
var backdrop = GetBackdropOption();
var windowChrome = WindowChrome.GetWindowChrome(this);
windowChrome?.GlassFrameThickness = useTransparency ? new Thickness(1) : new Thickness(0);
if (useTransparency)
{
if (App.IsWin11)
{
if (Environment.OSVersion.Version >= new Version(10, 0, 22523))
{
WindowHelper.EnableBackdropMicaBlur(this, CurrentTheme == Themes.Dark);
}
else
{
WindowHelper.EnableMicaBlur(this, CurrentTheme == Themes.Dark);
}
}
else if (App.IsWin10)
{
WindowHelper.EnableBlur(this);
}
else
{
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
}
ApplyBackdrop(backdrop);
}
else
{
@@ -216,6 +206,123 @@ public partial class ViewerWindow : Window
}
}
private void ApplyBackdrop(SystembackdropType backdrop)
{
switch (backdrop)
{
case SystembackdropType.None:
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
break;
case SystembackdropType.Mica:
if (App.IsWin11)
{
if (Environment.OSVersion.Version >= new Version(10, 0, 22523))
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBackdropMicaBlur(this, CurrentTheme == Themes.Dark);
}
else
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableMicaBlur(this, CurrentTheme == Themes.Dark);
}
}
else if (App.IsWin10)
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBlur(this);
}
else
{
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
}
break;
case SystembackdropType.Acrylic:
if (App.IsWin11 && Environment.OSVersion.Version >= new Version(10, 0, 22523))
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBackdropAcrylicBlur(this, CurrentTheme == Themes.Dark);
}
else if (App.IsWin10)
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBlur(this);
}
else
{
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
}
break;
case SystembackdropType.Tabbed:
if (App.IsWin11 && Environment.OSVersion.Version >= new Version(10, 0, 22523))
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBackdropTabbedBlur(this, CurrentTheme == Themes.Dark);
}
else if (App.IsWin10)
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBlur(this);
}
else
{
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
}
break;
case SystembackdropType.Auto:
default:
if (App.IsWin11)
{
if (Environment.OSVersion.Version >= new Version(10, 0, 22523))
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBackdropMicaBlur(this, CurrentTheme == Themes.Dark);
}
else
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableMicaBlur(this, CurrentTheme == Themes.Dark);
}
}
else if (App.IsWin10)
{
WindowHelper.DisableDwmBlur(this);
WindowHelper.EnableBlur(this);
}
else
{
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
}
break;
}
}
private static SystembackdropType GetBackdropOption()
{
var option = SettingHelper.Get("WindowBackdrop", nameof(SystembackdropType.Auto), "QuickLook")?.Trim();
if (string.IsNullOrEmpty(option))
return SystembackdropType.Auto;
if (string.Equals(option, nameof(SystembackdropType.Acrylic), StringComparison.OrdinalIgnoreCase))
return SystembackdropType.Acrylic;
if (string.Equals(option, nameof(SystembackdropType.Tabbed), StringComparison.OrdinalIgnoreCase))
return SystembackdropType.Tabbed;
return Enum.TryParse(option, true, out SystembackdropType parsed)
? parsed
: SystembackdropType.Auto;
}
private void SaveWindowSizeOnSizeChanged(object sender, SizeChangedEventArgs e)
{
// first shown?