Xamarin表单检查是页面是模态



所以,基本上,我试图了解页面是否以模式推送。

这是我的扩展方法的代码:

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具有显示在调试器中的CurrentPageRootPage等属性,但使用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);
}

最新更新