Browse Source

Fix safe area calcs for navigation page (#21221)

* fix safe area calcs for navigation page

* update nav bar effective height on safe area change

* reset nav bar height if visibility changes

* add tests
release/latest
Emmanuel Hansen 5 months ago
committed by Julien Lebosquain
parent
commit
08e08319e2
  1. 19
      src/Avalonia.Controls/Page/NavigationPage.cs
  2. 13
      tests/Avalonia.Controls.UnitTests/NavigationPageTests.cs

19
src/Avalonia.Controls/Page/NavigationPage.cs

@ -639,6 +639,9 @@ namespace Avalonia.Controls
"Direct assignment to NavigationPage.Pages is not supported. Use PushAsync, PopAsync, InsertPage, RemovePage, or ReplaceAsync to modify the navigation stack."); "Direct assignment to NavigationPage.Pages is not supported. Use PushAsync, PopAsync, InsertPage, RemovePage, or ReplaceAsync to modify the navigation stack.");
} }
if (change.Property == SafeAreaPaddingProperty)
UpdateEffectiveBarHeight();
base.OnPropertyChanged(change); base.OnPropertyChanged(change);
} }
@ -750,7 +753,10 @@ namespace Avalonia.Controls
{ {
if (_contentHost != null && _navBar != null) if (_contentHost != null && _navBar != null)
{ {
_navBar.Padding = new Thickness(SafeAreaPadding.Left, SafeAreaPadding.Top, SafeAreaPadding.Right, 0); var safeAreaPadding = IsNavBarEffectivelyVisible ? new Thickness(SafeAreaPadding.Left, 0, SafeAreaPadding.Right, SafeAreaPadding.Bottom) : SafeAreaPadding;
_navBar.Padding = IsNavBarEffectivelyVisible
? new Thickness(SafeAreaPadding.Left, SafeAreaPadding.Top, SafeAreaPadding.Right, 0)
: default;
if (_pagePresenter != null) if (_pagePresenter != null)
_pagePresenter.Padding = Padding; _pagePresenter.Padding = Padding;
@ -759,8 +765,8 @@ namespace Avalonia.Controls
if (CurrentPage != null) if (CurrentPage != null)
{ {
var remainingSafeArea = Padding.GetRemainingSafeAreaPadding(SafeAreaPadding); var remainingSafeArea = Padding.GetRemainingSafeAreaPadding(safeAreaPadding);
CurrentPage.SafeAreaPadding = new Thickness(remainingSafeArea.Left, 0, remainingSafeArea.Right, remainingSafeArea.Bottom); CurrentPage.SafeAreaPadding = new Thickness(remainingSafeArea.Left, remainingSafeArea.Top, remainingSafeArea.Right, remainingSafeArea.Bottom);
} }
foreach (var modal in _modalStack) foreach (var modal in _modalStack)
@ -2148,8 +2154,11 @@ namespace Avalonia.Controls
private void UpdateEffectiveBarHeight() private void UpdateEffectiveBarHeight()
{ {
EffectiveBarHeight = (CurrentPage != null ? GetBarHeightOverride(CurrentPage) : null) ?? BarHeight; var contentBarHeight = (CurrentPage != null ? GetBarHeightOverride(CurrentPage) : null) ?? BarHeight;
PseudoClasses.Set(":nav-bar-compact", EffectiveBarHeight < 40); EffectiveBarHeight = contentBarHeight + SafeAreaPadding.Top;
PseudoClasses.Set(":nav-bar-compact", contentBarHeight < 40);
UpdateContentSafeAreaPadding();
} }
private void ApplyNavBarVisibility() private void ApplyNavBarVisibility()

13
tests/Avalonia.Controls.UnitTests/NavigationPageTests.cs

@ -1385,6 +1385,19 @@ public class NavigationPageTests
var nav = new NavigationPage { IsGestureEnabled = value }; var nav = new NavigationPage { IsGestureEnabled = value };
Assert.Equal(value, nav.IsGestureEnabled); Assert.Equal(value, nav.IsGestureEnabled);
} }
[Fact]
public async Task SafeAreaPadding_Affeccts_Nav_Bar_Height()
{
var nav = new NavigationPage()
{
SafeAreaPadding = new Thickness(10)
};
var page = new ContentPage();
NavigationPage.SetBarHeightOverride(page, 60.0);
await nav.PushAsync(page);
Assert.Equal(70.0, nav.EffectiveBarHeight);
}
} }
public class AttachedPropertyTests : ScopedTestBase public class AttachedPropertyTests : ScopedTestBase

Loading…
Cancel
Save