iOS上不支持全局支持PushAsync,请使用NavigationPage

时间:2017-07-14 18:51:25

标签: c# xaml xamarin.forms

当我处理ListView项目的Tap事件时,一切正常,但是当我在TabbedPage中使用它时显示异常请提前解决此问题。

  

例外:iOS上不支持全局支持PushAsync,请使用NavigationPage。

这是Xaml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:NavTest" x:Class="NavTest.NavTestPage" Title="Home">
        <ContentPage.Content>
            <StackLayout Orientation="Vertical" VerticalOptions="Center">
                <Label Text="Welcome to Xamarin Forms!" VerticalOptions="Center" HorizontalOptions="Center" />
                <!--<Button Text="Go to " BackgroundColor="Lime" VerticalOptions="Center" Clicked="Handle_Clicked" >
            </Button>-->
                <ListView x:Name="myListView" ItemSelected="Handle_ItemSelected">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Label Text="{Binding}" VerticalOptions="Center" HorizontalOptions="Center" />
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackLayout>
        </ContentPage.Content>
    </ContentPage>

这是OnClick处理程序:

    async void Handle_Clicked(object sender, System.EventArgs e)
    {
        await  Navigation.PushAsync(new Page1());
    }                    

4 个答案:

答案 0 :(得分:11)

仅在iOS中运行时会出现此错误。

在App.cs Rootpage(起始页)中,如下所示

 public App()
  {
      MainPage=new NavigationPage(new LoginPage());
  }

现在,我们可以在全球使用PushAsyn()

答案 1 :(得分:2)

您的App.xaml.cs

中可能有类似的代码
public App()
{
    InitializeComponent();

    var tabs = new TabbedPage();    
    tabs.Children.Add(new NavTestPage() { Title = "Tab title" });
    MainPage = tabs;
}

您应该更改为:

public App()
{
    InitializeComponent();

    var tabs = new TabbedPage();
    var page = new NavTestPage() { Title = "Page title" };    
    tabs.Children.Add(new NavigationPage(page) { Title = "Tab title" });

    MainPage = tabs;
}

通过包裹NavigationPage,您可以选择将页面推送到导航堆栈。 TabbedPage本身就是标签,每个标签只有1页。这应该给你一个像这样的结构:

TabbedPage
    NavigationPage
        ContentPage
    NavigationPage
        ContentPage
    NavigationPage
        ContentPage

<强>更新 我猜你正在做的只是在XAML中将ContentPage更改为TabbedPage。这不是TabbedPage的工作方式。您可能应该首先了解TabbedPage实际上是如何运作的。

https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/navigation/tabbed-page/

在你的情况下,你应该创建一个像这样的XAML的新页面:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:local="clr-namespace:NavTest"
            x:Class="NavTest.MyTabbedPage">
    <NavigationPage Title="NavTest">
        <x:Arguments>
            <local:NavTestPage />
        </x:Arguments>
    </NavigationPage>
</TabbedPage>

将此设置为MainPage中的App.xaml.cs

public App()
{
    InitializeComponent();
    MainPage = new MyTabbedPage();
}

答案 2 :(得分:0)

您应该将TabbedPage子页面放入NavigationPage。以下是Xamarin文档中的代码片段。

在Xaml中:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:local="clr-namespace:TabbedPageWithNavigationPage;assembly=TabbedPageWithNavigationPage"
        x:Class="TabbedPageWithNavigationPage.MainPage">
    <local:TodayPage />
    <NavigationPage Title="Schedule" Icon="schedule.png">
        <x:Arguments>
            <local:SchedulePage />
        </x:Arguments>
    </NavigationPage>
</TabbedPage>

或代码:

public class MainPageCS : TabbedPage
{
    public MainPageCS ()
    {
        var navigationPage = new NavigationPage (new SchedulePageCS ());
        navigationPage.Icon = "schedule.png";
        navigationPage.Title = "Schedule";

        Children.Add (new TodayPageCS ());
        Children.Add (navigationPage);
    }
}

答案 3 :(得分:0)

在此错误中它会找到根页面,如果我们使用的是主详细信息页面,那么我们只需要为详细信息页面设置导航。因此,以下将是最好的解决方案。

((RootPage)Application.Current.MainPage).Detail.Navigation.PushAsync(new SearchPage());