Browse Source

Add framework support for TopLevel transparency level.

pull/3962/head
Dan Walmsley 7 years ago
parent
commit
a30e6d8cf6
  1. 2
      src/Avalonia.Controls/Platform/ITopLevelImpl.cs
  2. 40
      src/Avalonia.Controls/TopLevel.cs
  3. 16
      src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml
  4. 16
      src/Avalonia.Themes.Default/OverlayPopupHost.xaml
  5. 16
      src/Avalonia.Themes.Default/PopupRoot.xaml
  6. 20
      src/Avalonia.Themes.Default/Window.xaml

2
src/Avalonia.Controls/Platform/ITopLevelImpl.cs

@ -59,6 +59,8 @@ namespace Avalonia.Platform
/// </summary>
Action<double> ScalingChanged { get; set; }
Action<WindowTransparencyLevel> TransparencyLevelChanged { get; set; }
/// <summary>
/// Creates a new renderer for the toplevel.
/// </summary>

40
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
{
/// <summary>
/// Base class for top-level widgets.
/// </summary>
@ -49,6 +51,12 @@ namespace Avalonia.Controls
public static readonly StyledProperty<WindowTransparencyLevel> TransparencyLevelProperty =
AvaloniaProperty.Register<TopLevel, WindowTransparencyLevel>(nameof(TransparencyLevel), WindowTransparencyLevel.None);
/// <summary>
/// Defines the <see cref="Background"/> property.
/// </summary>
public static readonly StyledProperty<IBrush> TransparencyBackgroundFallbackProperty =
AvaloniaProperty.Register<TopLevel, IBrush>(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;
/// <summary>
/// Initializes static members of the <see cref="TopLevel"/> 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;
}
}
}
/// <inheritdoc/>
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<Border>("PART_TransparencyFallback");
HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevel);
}
/// <summary>
/// Raises the <see cref="Opened"/> event.
/// </summary>

16
src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml

@ -3,13 +3,15 @@
<Setter Property="FontSize" Value="{DynamicResource FontSizeNormal}"/>
<Setter Property="Template">
<ControlTemplate>
<Border Background="{TemplateBinding Background}">
<VisualLayerManager>
<ContentPresenter Name="PART_ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"/>
</VisualLayerManager>
<Border Name="PART_TransparencyFallback">
<Border Background="{TemplateBinding Background}">
<VisualLayerManager>
<ContentPresenter Name="PART_ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"/>
</VisualLayerManager>
</Border>
</Border>
</ControlTemplate>
</Setter>

16
src/Avalonia.Themes.Default/OverlayPopupHost.xaml

@ -2,13 +2,15 @@
<Setter Property="Background" Value="{DynamicResource ThemeBackgroundBrush}"/>
<Setter Property="Template">
<ControlTemplate>
<VisualLayerManager IsPopup="True">
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</VisualLayerManager>
<Border Name="PART_TransparencyFallback">
<VisualLayerManager IsPopup="True">
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</VisualLayerManager>
</Border>
</ControlTemplate>
</Setter>
</Style>

16
src/Avalonia.Themes.Default/PopupRoot.xaml

@ -2,13 +2,15 @@
<Setter Property="Background" Value="{DynamicResource ThemeBackgroundBrush}"/>
<Setter Property="Template">
<ControlTemplate>
<VisualLayerManager IsPopup="True">
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</VisualLayerManager>
<Border Name="PART_TransparencyFallback">
<VisualLayerManager IsPopup="True">
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</VisualLayerManager>
</Border>
</ControlTemplate>
</Setter>
</Style>

20
src/Avalonia.Themes.Default/Window.xaml

@ -4,15 +4,17 @@
<Setter Property="FontSize" Value="{DynamicResource FontSizeNormal}"/>
<Setter Property="Template">
<ControlTemplate>
<Border Background="{TemplateBinding Background}">
<VisualLayerManager>
<ContentPresenter Name="PART_ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
</VisualLayerManager>
<Border Name="PART_TransparencyFallback">
<Border Background="{TemplateBinding Background}">
<VisualLayerManager>
<ContentPresenter Name="PART_ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
</VisualLayerManager>
</Border>
</Border>
</ControlTemplate>
</Setter>

Loading…
Cancel
Save