dotnet/maui

FlyoutPage.IsPresented behaves different to Xamarin 5

Open

#10,101 opened on Sep 13, 2022

View on GitHub
 (2 comments) (0 reactions) (0 assignees)C# (1,951 forks)batch import
area-controls-flyoutpagehelp wantedplatform/windowss/triageds/verifiedt/bugt/docs 📝

Repository metrics

Stars
 (23,245 stars)
PR merge metrics
 (Avg merge 47d 9h) (248 merged PRs in 30d)

Description

Description

The documentation shows that IsPresented must be set to false so that the flyout closes on phones:

void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var item = e.CurrentSelection.FirstOrDefault() as FlyoutPageItem;
    if (item != null)
    {            
        Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
        IsPresented = false;
    }
}

But this code throws an exception on the Windows platform: https://github.com/dotnet/maui/blob/65104a2163505138e3b9f2cc798a2e9c4f577566/src/Controls/src/Core/FlyoutPage.cs#L286-L289

Please, update the documentation. See workaround.

Xamarin: The behavior changed since Xamarin 5. In Xamarin I have used: https://github.com/jbe2277/waf/blob/acbf97f70736203b47e5e99d399d691d6121fb0f/src/NewsReader/NewsReader.Presentation/Views/ShellView.xaml.cs#L64

This doesn't work correct anymore. The exception is raised on the Windows platform.

Maybe related: https://github.com/dotnet/maui/issues/9801

Steps to Reproduce

Clone this repo: https://github.com/jbe2277/waf/tree/b42f0f1a26287dce428f3c34a2c90b4a7d2aeab7

Link to public reproduction project repository

https://github.com/jbe2277/waf/tree/b42f0f1a26287dce428f3c34a2c90b4a7d2aeab7

Version with bug

6.0.486 (current)

Last version that worked well

Unknown/Other

Affected platforms

Windows

Affected platform versions

net6.0-windows10.0.19041.0

Did you find any workaround?

This commit solved the issue: https://github.com/jbe2277/waf/commit/69803cef490970a344c370616021464f59ae201d

The important part is:

if (!((IFlyoutPageController)this).ShouldShowSplitMode) IsPresented = false;

I believe this API has some flaws:

  1. It's necessary to cast this so that ShouldShowSplitMode can be accessed. However, this is a main use case and so it should be accessible directly via FlyoutPage.
  2. The CanChangeIsPresented property which I used first for the check doesn't work as expected. Although the property returned true, setting of IsPresented = false resulted in the exception.

Relevant log output

No response

Contributor guide