diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index 8e892ffc21..b22962115e 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -59,6 +59,8 @@ namespace Avalonia.Platform /// Action ScalingChanged { get; set; } + Action TransparencyLevelChanged { get; set; } + /// /// Creates a new renderer for the toplevel. /// diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 8861c72418..3ac5779ed3 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -6,6 +6,7 @@ using Avalonia.Input.Raw; using Avalonia.Layout; using Avalonia.Logging; using Avalonia.LogicalTree; +using Avalonia.Media; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Styling; @@ -14,6 +15,7 @@ using JetBrains.Annotations; namespace Avalonia.Controls { + /// /// Base class for top-level widgets. /// @@ -49,6 +51,12 @@ namespace Avalonia.Controls public static readonly StyledProperty TransparencyLevelProperty = AvaloniaProperty.Register(nameof(TransparencyLevel), WindowTransparencyLevel.None); + /// + /// Defines the property. + /// + public static readonly StyledProperty TransparencyBackgroundFallbackProperty = + AvaloniaProperty.Register(nameof(TransparencyBackgroundFallback), Brushes.White); + private readonly IInputManager _inputManager; private readonly IAccessKeyHandler _accessKeyHandler; private readonly IKeyboardNavigationHandler _keyboardNavigationHandler; @@ -56,6 +64,7 @@ namespace Avalonia.Controls private readonly IGlobalStyles _globalStyles; private Size _clientSize; private ILayoutManager _layoutManager; + private Border _transparencyFallbackBorder; /// /// Initializes static members of the class. @@ -117,6 +126,7 @@ namespace Avalonia.Controls impl.Paint = HandlePaint; impl.Resized = HandleResized; impl.ScalingChanged = HandleScalingChanged; + impl.TransparencyLevelChanged = HandleTransparencyLevelChanged; _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); @@ -173,6 +183,12 @@ namespace Avalonia.Controls set { SetValue(TransparencyLevelProperty, value); } } + public IBrush TransparencyBackgroundFallback + { + get => GetValue(TransparencyBackgroundFallbackProperty); + set => SetValue(TransparencyBackgroundFallbackProperty, value); + } + public ILayoutManager LayoutManager { get @@ -330,6 +346,21 @@ namespace Avalonia.Controls LayoutHelper.InvalidateSelfAndChildrenMeasure(this); } + protected virtual void HandleTransparencyLevelChanged(WindowTransparencyLevel transparencyLevel) + { + if(_transparencyFallbackBorder != null) + { + if(transparencyLevel == WindowTransparencyLevel.None) + { + _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; + } + else + { + _transparencyFallbackBorder.Background = Brushes.Transparent; + } + } + } + /// protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { @@ -339,6 +370,15 @@ namespace Avalonia.Controls $"Control '{GetType().Name}' is a top level control and cannot be added as a child."); } + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) + { + base.OnApplyTemplate(e); + + _transparencyFallbackBorder = e.NameScope.Find("PART_TransparencyFallback"); + + HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevel); + } + /// /// Raises the event. /// diff --git a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml b/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml index 1fd168c009..3acab7d7bc 100644 --- a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml +++ b/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml @@ -3,13 +3,15 @@ - - - - + + + + + + diff --git a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml b/src/Avalonia.Themes.Default/OverlayPopupHost.xaml index 56b3699c07..e57325499d 100644 --- a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml +++ b/src/Avalonia.Themes.Default/OverlayPopupHost.xaml @@ -2,13 +2,15 @@ - - - + + + + + diff --git a/src/Avalonia.Themes.Default/PopupRoot.xaml b/src/Avalonia.Themes.Default/PopupRoot.xaml index cf063f5390..1a55d2f7a4 100644 --- a/src/Avalonia.Themes.Default/PopupRoot.xaml +++ b/src/Avalonia.Themes.Default/PopupRoot.xaml @@ -2,13 +2,15 @@ - - - + + + + + diff --git a/src/Avalonia.Themes.Default/Window.xaml b/src/Avalonia.Themes.Default/Window.xaml index 2a8b5d0fca..e29409e894 100644 --- a/src/Avalonia.Themes.Default/Window.xaml +++ b/src/Avalonia.Themes.Default/Window.xaml @@ -4,15 +4,17 @@ - - - - + + + + + +