Xamarin.Forms Navigation.PushAsync不工作

时间:2016-03-10 03:19:46

标签: c# xamarin.ios xamarin.forms

我有一个Xamarin.Forms项目,我有一个自定义控件,在点击时应该打开一个新页面。不幸的是,当我拨打Navigation.PushAsync(...);时没有任何反应。我已经阅读了无数的StackOverflow问题(such as this one)和Xamarin论坛主题并完成了几次Google搜索,但没有一个解决方案似乎可以解决我的问题。

  • 我的控件继承自ContentView,与所有Xamarin.Forms视图一样 做。
  • src是一个包含一些数据点的自定义类 由此控件和EventDetailsPage使用。
  • 我可以确认手势 自行工作,但对PushAsync()的调用什么也没做。
  • 我尝试过以某种方式操纵语句,以便使用NavigationPage(使其成为myNavigationPage.Navigation.PushAsync(new EventDetailsPage(src));)。
  • 我还尝试创建一个构造函数,该构造函数接受Page并使用它与上述点类似。

我的对手的构造函数:

public EventControl() {
    InitializeComponent();
    GestureRecognizers.Add(new TapGestureRecognizer() {
        Command = new Command(() => Navigation.PushAsync(new EventDetailsPage(src)))
    });
}

通常情况下,在我尝试解决问题时,在StackOverflow上提出新问题是我的最后一招。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:8)

像这样更改 App.cs

  public App()
    {
        InitializeComponent();

        MainPage = new NavigationPage(new MainPage());//Very important add this..
        //MainPage = new MainPage(); //not like this        
    }

答案 1 :(得分:1)

我发现了问题。 Keith Rome lead me查看EventDetailsPage,我注释掉了一行XAML,解决了这个问题。该行正在向页面添加自定义控件(与EventControl无关)。我不知道控件的定义或其自定义渲染的定义是否导致奇怪的行为,但删除该行解决了这个问题。

答案 2 :(得分:0)

出于不同的原因同样的问题...

在Visual Studio中安装更新后,我遇到了这个问题,包括Xamarin。

在更新了所有我的nuget包后,通过以下内容(第一个显示哪些包含更新的命令),我能够解决问题:

Get-Package -updates
Update-Package <package>

我怀疑,删除AppData \ local \ Xamarin文件夹(它似乎充当缓存)并让它重新填充也可以解决问题。

答案 3 :(得分:0)

我实现了具有一个输入字符串的AppShell类,以设置正确的页面:

    public partial class AppShell : Shell
    {
        public AppShell(string startUpPageString = null)
        {
            InitializeComponent();

            Page startUpPage;
            if (startUpPageString == nameof(SignUpPage))
            {
                startUpPage = new SignUpPage();
            }
            else if (startUpPageString == nameof(LoginPinPage))
            {
                startUpPage = new LoginPinPage();
            }
            else
            {
                startUpPage = new SignUpPage();
            }

            ShellSection shellSection = new ShellSection();
            shellSection.Items.Add(new ShellContent() { Content = startUpPage });

            CurrentItem = shellSection;

            RegisterRoutes();
        }

        private void RegisterRoutes()
        {
            ...removed for clarity
        }
    }

其中,在我的XAML中,我添加了一些通过GoToAsync(postlogin)方法调用的标签(登录后部分):

<Shell xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:login="clr-namespace:XXX.Views.Login"
       xmlns:postlogin ="clr-namespace:XXX.XXX.Views.PostLogin"
       x:Class="XXX.AppShell"
       FlyoutBehavior="Disabled">


    <ShellItem Route="postlogin">
        <ShellSection Route="activity_section" Title="Activity" Icon="Activity_Menu_Icon.png">
            <ShellContent  Route="page1"
                      Title="Page1"
                      Icon="Pag1.png"
                      ContentTemplate="{DataTemplate postlogin:Page1}" />
        </ShellSection>
 <ShellContent  Route="page2"
                      Title="Page2"
                      Icon="Pag2.png"
                      ContentTemplate="{DataTemplate postlogin:Page2}" />
        </ShellSection>
 <ShellContent  Route="page3"
                      Title="Page3"
                      Icon="Page3.png"
                      ContentTemplate="{DataTemplate postlogin:Page3}" />
        </ShellSection>
 <ShellContent  Route="page4"
                      Title="Page4"
                      Icon="Pag4.png"
                      ContentTemplate="{DataTemplate postlogin:Page4}" />
        </ShellSection>
    </ShellItem>

    <FlyoutItem Route="others"
                Title="OTHERS"
                FlyoutDisplayOptions="AsMultipleItems">
        <Tab>
            <ShellContent Route="cats"

                          Title="Cats"
                          Icon="next_7.png"
                       />
            <ShellContent Route="dogs"

                          Title="Dogs"
                          Icon="next_7.png"
                          />
        </Tab>
    </FlyoutItem>
</Shell>

因此,我的问题如下:例如,进入SignUpPage后,我单击一个按钮,然后该按钮执行: await Shell.Current.Navigation.PushAsync(new SentEmailPage());听起来很吸引人:Object reference not set to an instance of an object.at Xamarin.Forms.ShellSection.OnPushAsync