Xamarin.forms Xamarin表单检查页面是否为模态

Xamarin.forms Xamarin表单检查页面是否为模态,xamarin.forms,mvvm,Xamarin.forms,Mvvm,所以基本上我是想找出一个页面是不是被按模式推的 以下是我的扩展方法的代码: public static bool IsModal(this Page page) { return page.Navigation.ModalStack.Any(p => page == p); } 问题是,p从不等于page,因为p在运行时更改了导航页面,尽管intellisense在编译时将其报告为页面类型 我曾尝试将p强制转换为页面,但类型在运行时没有改变,intellisense只是抱怨强制转

所以基本上我是想找出一个页面是不是被按模式推的

以下是我的扩展方法的代码:

public static bool IsModal(this Page page)
{
    return page.Navigation.ModalStack.Any(p => page == p);
}
问题是,
p
从不等于
page
,因为
p
在运行时更改了导航页面,尽管intellisense在编译时将其报告为页面类型

我曾尝试将
p
强制转换为页面,但类型在运行时没有改变,intellisense只是抱怨强制转换是多余的

我在视图模型中使用
CurrentPage.IsModal
来调用此扩展
CurrentPage
是编译时的一种页面类型,但在运行时会更改为NavigationPage


令人困惑的是,在调试过程中,
p
具有诸如
CurrentPage
RootPage
等属性,这些属性显示在调试器中,但使用
p.CurrentPage
无法访问,因为编译器抱怨它们不存在!?!我想试着比较一下,但我不能访问它们,但可以在调试器中查看它们。

你能试试这个吗,可能会有打字错误,我徒手写了这个

public static bool IsModal(this Page page)
        {
            if (page.Navigation.ModalStack.Count > 0)
            {
                foreach (var thisPage in page.Navigation.ModalStack)
                {
                    if (thisPage.Equals(page))
                        return true;
                }
                return false;
            }
            else
                return false;
        }
因此,该代码起作用:

public static class PageExtensions
{
    public static bool IsModal(this Page page)
    {
        return page.Navigation.ModalStack.Any(p=> ((NavigationPage) p).CurrentPage.Equals(page));
    }
}

我担心这是不安全的,因为它假定
p
是导航页面的一种类型。

您需要首先检查页面的类型,没有导航栏的页面也可以通过以下方式推送:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void  Button_Clicked(object sender, EventArgs e)
    {
        Page1 p = new Page1();

        await this.Navigation.PushModalAsync(p, true);

        bool b = PageExtensions.IsModal(p);

        Console.WriteLine(b);
    }
}

public static class PageExtensions
{
    public static bool IsModal(this Page page)
    {
        if (page.GetType() == typeof(NavigationPage))
        {
            return page.Navigation.ModalStack.Any(p => ((NavigationPage)p).CurrentPage.Equals(page));
        }
        else
        {
            return page.Navigation.ModalStack.Any(p => p.Equals(page));
        }
    }
}

您的语法是正确的,但是比较仍然失败。我尝试过类似的代码,使用==或equals比较器,它们都失败了。这与迭代page.Navigation.ModalStack有关,类型是NavigationPage而不是page。简单的强制转换不起作用,因为编译器在运行时认为页面已经是页面了。谢谢Jack,我已经将此标记为答案,尽管它与我的非常相似。当我发现演员阵容可能会失败时,它增加了页面类型检查的清晰度。