diff --git a/src/AvaloniaInside.Shell/NavigationBar.cs b/src/AvaloniaInside.Shell/NavigationBar.cs index 15c1a22..35a201d 100644 --- a/src/AvaloniaInside.Shell/NavigationBar.cs +++ b/src/AvaloniaInside.Shell/NavigationBar.cs @@ -519,14 +519,16 @@ protected virtual void UpdateHeader(object? view, ContentControl itemPresenter) protected virtual void UpdateSafePaddingSizes() { - TopSafeSpace = SafePadding.Top; - TopSafePadding = new Thickness(0, SafePadding.Top, 0, 0); - LeftSafeSpace = SafePadding.Left; - LeftSafePadding = new Thickness(SafePadding.Left, 0, 0, 0); - RightSafeSpace = SafePadding.Right; - RightSafePadding = new Thickness(0, 0, SafePadding.Right, 0); - - Height = PlatformHeight + (ApplyTopSafePadding ? SafePadding.Top : 0); + var safePadding = Page?.IsModal != true ? SafePadding : new Thickness(0, 0, 0, 0); + + TopSafeSpace = safePadding.Top; + TopSafePadding = new Thickness(0, safePadding.Top, 0, 0); + LeftSafeSpace = safePadding.Left; + LeftSafePadding = new Thickness(safePadding.Left, 0, 0, 0); + RightSafeSpace = safePadding.Right; + RightSafePadding = new Thickness(0, 0, safePadding.Right, 0); + + Height = PlatformHeight + (ApplyTopSafePadding ? safePadding.Top : 0); } #endregion diff --git a/src/AvaloniaInside.Shell/Page.cs b/src/AvaloniaInside.Shell/Page.cs index a64f275..ff3523c 100644 --- a/src/AvaloniaInside.Shell/Page.cs +++ b/src/AvaloniaInside.Shell/Page.cs @@ -3,12 +3,14 @@ using System.Threading; using System.Threading.Tasks; using Avalonia; +using Avalonia.Controls.Metadata; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Interactivity; namespace AvaloniaInside.Shell; +[PseudoClasses(":modal")] public class Page : UserControl, INavigationLifecycle, INavigatorLifecycle, INavigationBarProvider { private ContentPresenter? _navigationBarPlaceHolder; @@ -22,8 +24,6 @@ public class Page : UserControl, INavigationLifecycle, INavigatorLifecycle, INav public INavigator? Navigator => Shell?.Navigator; - public NavigationChain Chain { get; internal set; } - protected override Type StyleKeyOverride => typeof(Page); #region Shell @@ -39,6 +39,28 @@ public ShellView? Shell #endregion + #region Chain + + public static readonly DirectProperty BackCommandProperty = + AvaloniaProperty.RegisterDirect( + nameof(Chain), + o => o.Chain, + (o, v) => o.Chain = v); + + private NavigationChain? _chain; + + public NavigationChain? Chain + { + get => _chain; + set + { + if (SetAndRaise(BackCommandProperty, ref _chain, value)) + IsModal = value?.Type == NavigateType.Modal; + } + } + + #endregion + #region SafePadding public static readonly StyledProperty SafePaddingProperty = @@ -234,6 +256,25 @@ public Thickness TabSafePadding #endregion + #region IsModal + + /// + /// Defines the property. + /// + public static readonly StyledProperty IsModalProperty = + AvaloniaProperty.Register(nameof(IsModal), false); + + /// + /// Gets or sets whether the is modal. + /// + public bool IsModal + { + get => GetValue(IsModalProperty); + internal set => SetValue(IsModalProperty, value); + } + + #endregion + #endregion #region Lifecycle @@ -264,6 +305,8 @@ protected override void OnLoaded(RoutedEventArgs e) this[!ApplyBottomSafePaddingProperty] = this[!ShellView.EnableSafeAreaForBottomProperty]; this[!ApplyLeftSafePaddingProperty] = this[!ShellView.EnableSafeAreaForLeftProperty]; this[!ApplyRightSafePaddingProperty] = this[!ShellView.ApplyRightSafePaddingProperty]; + + IsModal = Chain.Type == NavigateType.Modal; } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) @@ -280,6 +323,11 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang { UpdateSafePaddingSizes(); } + else if (change.Property == IsModalProperty) + { + PseudoClasses.Set(":modal", IsModal); + UpdateSafePaddingSizes(); + } } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) @@ -297,7 +345,7 @@ private void ApplyNavigationBar() return; if ((type == NavigationBarAttachType.ToLastPage && Chain is HostNavigationChain) || - (type == NavigationBarAttachType.ToFirstHostThenPage && Chain?.Back is HostNavigationChain)) + (type == NavigationBarAttachType.ToFirstHostThenPage && Chain.Back is HostNavigationChain)) return; _navigationBarPlaceHolder.Content = _navigationBar = new NavigationBar(this); @@ -309,17 +357,18 @@ private void ApplyNavigationBar() protected virtual void UpdateSafePaddingSizes() { - TopSafeSpace = SafePadding.Top; - TopSafePadding = new Thickness(0, SafePadding.Top, 0, 0); - BottomSafeSpace = SafePadding.Bottom; - BottomSafePadding = new Thickness(0, 0, 0, SafePadding.Bottom); - LeftSafeSpace = SafePadding.Left; - LeftSafePadding = new Thickness(SafePadding.Left, 0, 0, 0); - RightSafeSpace = SafePadding.Right; - RightSafePadding = new Thickness(0, 0, SafePadding.Right, 0); - - PageSafePadding = new Thickness(SafePadding.Left, 0, SafePadding.Right, SafePadding.Bottom); - + var safePadding = !IsModal ? SafePadding : new Thickness(0, 0, 0, 0); + + TopSafeSpace = safePadding.Top; + TopSafePadding = new Thickness(0, safePadding.Top, 0, 0); + BottomSafeSpace = safePadding.Bottom; + BottomSafePadding = new Thickness(0, 0, 0, safePadding.Bottom); + LeftSafeSpace = safePadding.Left; + LeftSafePadding = new Thickness(safePadding.Left, 0, 0, 0); + RightSafeSpace = safePadding.Right; + RightSafePadding = new Thickness(0, 0, safePadding.Right, 0); + + PageSafePadding = new Thickness(safePadding.Left, 0, safePadding.Right, safePadding.Bottom); } #endregion diff --git a/src/AvaloniaInside.Shell/TabPage.cs b/src/AvaloniaInside.Shell/TabPage.cs index b494d08..359dbe9 100644 --- a/src/AvaloniaInside.Shell/TabPage.cs +++ b/src/AvaloniaInside.Shell/TabPage.cs @@ -254,26 +254,28 @@ static void SetPrivateDateTimePropertyValue(T member, string propName, object protected override void UpdateSafePaddingSizes() { - TopSafeSpace = SafePadding.Top; - TopSafePadding = new Thickness(0, SafePadding.Top, 0, 0); - BottomSafeSpace = SafePadding.Bottom; - BottomSafePadding = new Thickness(0, 0, 0, SafePadding.Bottom); - LeftSafeSpace = SafePadding.Left; - LeftSafePadding = new Thickness(SafePadding.Left, 0, 0, 0); - RightSafeSpace = SafePadding.Right; - RightSafePadding = new Thickness(0, 0, SafePadding.Right, 0); + var safePadding = !IsModal ? SafePadding : new Thickness(0, 0, 0, 0); + + TopSafeSpace = safePadding.Top; + TopSafePadding = new Thickness(0, safePadding.Top, 0, 0); + BottomSafeSpace = safePadding.Bottom; + BottomSafePadding = new Thickness(0, 0, 0, safePadding.Bottom); + LeftSafeSpace = safePadding.Left; + LeftSafePadding = new Thickness(safePadding.Left, 0, 0, 0); + RightSafeSpace = safePadding.Right; + RightSafePadding = new Thickness(0, 0, safePadding.Right, 0); PageSafePadding = new Thickness( - TabStripPlacement != Dock.Left ? SafePadding.Left : 0, + TabStripPlacement != Dock.Left ? safePadding.Left : 0, 0, - TabStripPlacement != Dock.Right ? SafePadding.Right : 0, - TabStripPlacement != Dock.Bottom ? SafePadding.Bottom : 0); + TabStripPlacement != Dock.Right ? safePadding.Right : 0, + TabStripPlacement != Dock.Bottom ? safePadding.Bottom : 0); TabSafePadding = new Thickness( - TabStripPlacement != Dock.Right ? SafePadding.Left : 0, + TabStripPlacement != Dock.Right ? safePadding.Left : 0, 0, - TabStripPlacement != Dock.Left ? SafePadding.Right : 0, - TabStripPlacement != Dock.Top ? SafePadding.Bottom : 0); + TabStripPlacement != Dock.Left ? safePadding.Right : 0, + TabStripPlacement != Dock.Top ? safePadding.Bottom : 0); } #endregion