所以,基本上,我试图了解页面是否以模式推送。
这是我的扩展方法的代码:
public static bool IsModal(this Page page)
{
return page.Navigation.ModalStack.Any(p => page == p);
}
问题是;p
从不等于page
,因为p
在运行时更改为NavigationPage,尽管intelligense在编译时将其报告为Page的类型。
我尝试过将p
强制转换为Page,但类型在运行时不会改变,intellisense只是抱怨强制转换是多余的。
我在视图模型中使用CurrentPage.IsModal
来调用此扩展。CurrentPage
在编译时是Page的一种类型,但在运行时会更改为NavigationPage。
令人困惑的是,在调试过程中,p
具有显示在调试器中的CurrentPage
和RootPage
等属性,但使用p.CurrentPage
无法访问这些属性,因为编译器会抱怨它们不存在!?!我本来打算尝试比较这些,但我无法访问它们,但可以在调试器中查看它们。
您需要首先检查页面类型,没有导航栏的页面也可以模式推送:
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));
}
}
}
因此此代码有效:
public static class PageExtensions
{
public static bool IsModal(this Page page)
{
return page.Navigation.ModalStack.Any(p=> ((NavigationPage) p).CurrentPage.Equals(page));
}
}
我担心这是不安全的,因为它假设p
是NavigationPage的类型。
你能试试吗,可能有打字错误,我写了这个徒手
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 async Task NewModalPagePushAsync(Page pageToOpen)
{
var lastModalPage = Application.Current.MainPage.Navigation.ModalStack;
if (lastModalPage.Count >= 1)
{
if (lastModalPage.Last().GetType().Name == pageToOpen.GetType().Name)
return;
}
await Application.Current.MainPage.Navigation.PushModalAsync(pageToOpen);
}