Browse Source

Changed Mica dark/light based on theme

pull/12196/head
Lighto 3 years ago
parent
commit
55c03069b1
  1. 3
      samples/ControlCatalog/MainView.xaml
  2. 9
      src/Avalonia.Controls/WindowTransparencyLevel.cs
  3. 3
      src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindow.cs
  4. 33
      src/Windows/Avalonia.Win32/WindowImpl.cs

3
samples/ControlCatalog/MainView.xaml

@ -226,8 +226,7 @@
<WindowTransparencyLevel>Transparent</WindowTransparencyLevel>
<WindowTransparencyLevel>Blur</WindowTransparencyLevel>
<WindowTransparencyLevel>AcrylicBlur</WindowTransparencyLevel>
<WindowTransparencyLevel>MicaLight</WindowTransparencyLevel>
<WindowTransparencyLevel>MicaDark</WindowTransparencyLevel>
<WindowTransparencyLevel>Mica</WindowTransparencyLevel>
</ComboBox.Items>
</ComboBox>
<ComboBox x:Name="FlowDirection"

9
src/Avalonia.Controls/WindowTransparencyLevel.cs

@ -33,15 +33,10 @@ public readonly record struct WindowTransparencyLevel
public static WindowTransparencyLevel AcrylicBlur { get; } = new(nameof(AcrylicBlur));
/// <summary>
/// The window background is based on desktop wallpaper tint with a light blur. This will only work on Windows 11
/// The window background is based on desktop wallpaper tint with a blur. This will only work on Windows 11
/// </summary>
public static WindowTransparencyLevel MicaLight { get; } = new(nameof(MicaLight));
public static WindowTransparencyLevel Mica { get; } = new(nameof(Mica));
/// <summary>
/// The window background is based on desktop wallpaper tint with a dark blur. This will only work on Windows 11
/// </summary>
public static WindowTransparencyLevel MicaDark { get; } = new(nameof(MicaDark));
public override string ToString()
{
return _value;

3
src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindow.cs

@ -76,9 +76,6 @@ internal class WinUiCompositedWindow : IDisposable
using var compositionBrush = _surfaceBrush.QueryInterface<ICompositionBrush>();
spriteVisual.SetBrush(compositionBrush);
_target.SetRoot(containerVisual);
}
public void SetSurface(ICompositionSurface surface) => _surfaceBrush.SetSurface(surface);

33
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -106,6 +106,7 @@ namespace Avalonia.Win32
private static POINTER_PEN_INFO[]? s_historyPenInfos;
private static POINTER_INFO[]? s_historyInfos;
private static MOUSEMOVEPOINT[]? s_mouseHistoryInfos;
private PlatformThemeVariant _currentThemeVariant;
public WindowImpl()
{
@ -374,10 +375,8 @@ namespace Avalonia.Win32
SetTransparencyBlur(windowsVersion);
else if (level == WindowTransparencyLevel.AcrylicBlur)
SetTransparencyAcrylicBlur(windowsVersion);
else if (level == WindowTransparencyLevel.MicaLight)
SetTransparencyMicaLight(windowsVersion);
else if (level == WindowTransparencyLevel.MicaDark)
SetTransparencyMicaDark(windowsVersion);
else if (level == WindowTransparencyLevel.Mica)
SetTransparencyMica(windowsVersion);
TransparencyLevel = level;
return;
@ -420,7 +419,7 @@ namespace Avalonia.Win32
return windowsVersion >= WinUiCompositionShared.MinAcrylicVersion;
// Mica is supported on Windows >= 10.0.22000.
if (level == WindowTransparencyLevel.MicaLight || level == WindowTransparencyLevel.MicaDark)
if (level == WindowTransparencyLevel.Mica)
return windowsVersion >= WinUiCompositionShared.MinHostBackdropVersion;
return false;
@ -469,24 +468,19 @@ namespace Avalonia.Win32
_blurHost?.SetBlur(BlurEffect.Acrylic);
}
private void SetTransparencyMicaLight(Version windowsVersion)
private void SetTransparencyMica(Version windowsVersion)
{
// Mica only supported with composition on Windows >= 10.0.22000.
if (!_isUsingComposition || windowsVersion < WinUiCompositionShared.MinHostBackdropVersion)
return;
SetUseHostBackdropBrush(false);
_blurHost?.SetBlur(BlurEffect.MicaLight);
}
private void SetTransparencyMicaDark(Version windowsVersion)
{
// Mica only supported with composition on Windows >= 10.0.22000.
if (!_isUsingComposition || windowsVersion < WinUiCompositionShared.MinHostBackdropVersion)
return;
SetUseHostBackdropBrush(false);
_blurHost?.SetBlur(BlurEffect.MicaDark);
_blurHost?.SetBlur(_currentThemeVariant switch
{
PlatformThemeVariant.Light => BlurEffect.MicaLight,
PlatformThemeVariant.Dark => BlurEffect.MicaDark,
_ => throw new ArgumentOutOfRangeException()
});
}
private void SetAccentState(AccentState state)
@ -790,6 +784,7 @@ namespace Avalonia.Win32
public unsafe void SetFrameThemeVariant(PlatformThemeVariant themeVariant)
{
_currentThemeVariant = themeVariant;
if (Win32Platform.WindowsVersion.Build >= 22000)
{
var pvUseBackdropBrush = themeVariant == PlatformThemeVariant.Dark ? 1 : 0;
@ -798,6 +793,10 @@ namespace Avalonia.Win32
(int)DwmWindowAttribute.DWMWA_USE_IMMERSIVE_DARK_MODE,
&pvUseBackdropBrush,
sizeof(int));
if (TransparencyLevel == WindowTransparencyLevel.Mica)
{
SetTransparencyMica(Win32Platform.WindowsVersion);
}
}
}

Loading…
Cancel
Save