dotnet / maui

.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.
https://dot.net/maui
MIT License
21.95k stars 1.7k forks source link

FlyoutPage.IsPresented behaves different to Xamarin 5 #10101

Open jbe2277 opened 1 year ago

jbe2277 commented 1 year ago

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

Zhanglirong-Winnie commented 1 year ago

Verified this issue with Visual Studio Enterprise 17.8.0 Preview 1.0. Can repro on windows platform with sample project. waf.zip