Browse Source

Add acrylic blur level with fallbacks to blur reported.

pull/3962/head
Dan Walmsley 6 years ago
parent
commit
730862b753
  1. 16
      src/Avalonia.Controls/TopLevel.cs
  2. 7
      src/Avalonia.Controls/WindowTransparencyLevel.cs
  3. 5
      src/Avalonia.Native/WindowImplBase.cs
  4. 11
      src/Windows/Avalonia.Win32/WindowImpl.cs

16
src/Avalonia.Controls/TopLevel.cs

@ -376,13 +376,27 @@ namespace Avalonia.Controls
LayoutHelper.InvalidateSelfAndChildrenMeasure(this); LayoutHelper.InvalidateSelfAndChildrenMeasure(this);
} }
private bool TransparencyLevelsMatch (WindowTransparencyLevel requested, WindowTransparencyLevel received)
{
if(requested == received)
{
return true;
}
else if(requested >= WindowTransparencyLevel.Blur && received >= WindowTransparencyLevel.Blur)
{
return true;
}
return false;
}
protected virtual void HandleTransparencyLevelChanged(WindowTransparencyLevel transparencyLevel) protected virtual void HandleTransparencyLevelChanged(WindowTransparencyLevel transparencyLevel)
{ {
if(_transparencyFallbackBorder != null) if(_transparencyFallbackBorder != null)
{ {
if(transparencyLevel == WindowTransparencyLevel.None || if(transparencyLevel == WindowTransparencyLevel.None ||
TransparencyLevelHint == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None ||
transparencyLevel != TransparencyLevelHint) !TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel))
{ {
_transparencyFallbackBorder.Background = TransparencyBackgroundFallback; _transparencyFallbackBorder.Background = TransparencyBackgroundFallback;
} }

7
src/Avalonia.Controls/WindowTransparencyLevel.cs

@ -15,6 +15,11 @@
/// <summary> /// <summary>
/// The window background is a blur-behind where nothing is drawn in the window. /// The window background is a blur-behind where nothing is drawn in the window.
/// </summary> /// </summary>
Blur Blur,
/// <summary>
/// The window background is a blur-behind with a high blur radius. This level may fallback to Blur.
/// </summary>
AcrylicBlur
} }
} }

5
src/Avalonia.Native/WindowImplBase.cs

@ -395,6 +395,11 @@ namespace Avalonia.Native
{ {
if (TransparencyLevel != transparencyLevel) if (TransparencyLevel != transparencyLevel)
{ {
if (transparencyLevel >= WindowTransparencyLevel.Blur)
{
transparencyLevel = WindowTransparencyLevel.AcrylicBlur;
}
TransparencyLevel = transparencyLevel; TransparencyLevel = transparencyLevel;
_native.SetBlurEnabled(TransparencyLevel >= WindowTransparencyLevel.Blur); _native.SetBlurEnabled(TransparencyLevel >= WindowTransparencyLevel.Blur);

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

@ -239,6 +239,11 @@ namespace Avalonia.Win32
var accent = new AccentPolicy(); var accent = new AccentPolicy();
var accentStructSize = Marshal.SizeOf(accent); var accentStructSize = Marshal.SizeOf(accent);
if(transparencyLevel == WindowTransparencyLevel.AcrylicBlur && !canUseAcrylic)
{
transparencyLevel = WindowTransparencyLevel.Blur;
}
switch (transparencyLevel) switch (transparencyLevel)
{ {
default: default:
@ -251,11 +256,13 @@ namespace Avalonia.Win32
break; break;
case WindowTransparencyLevel.Blur: case WindowTransparencyLevel.Blur:
accent.AccentState = canUseAcrylic ? AccentState.ACCENT_ENABLE_ACRYLIC : AccentState.ACCENT_ENABLE_BLURBEHIND; accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND;
break; break;
case (WindowTransparencyLevel.Blur + 1): // hack force acrylic on windows 10. case WindowTransparencyLevel.AcrylicBlur:
case (WindowTransparencyLevel.AcrylicBlur + 1): // hack-force acrylic.
accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC;
transparencyLevel = WindowTransparencyLevel.AcrylicBlur;
break; break;
} }

Loading…
Cancel
Save