繁体   English   中英

Xamarin.Forms Navigation.PushAsync 不工作

[英]Xamarin.Forms Navigation.PushAsync Not Working

我有一个 Xamarin.Forms 项目,并且我有一个自定义控件,在点击时应该会打开一个新页面。 不幸的是,当我调用Navigation.PushAsync(...);时没有任何反应。 . 我已经阅读了无数 StackOverflow 问题( 例如这个问题)和 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 上提出一个新问题是我最后的选择。 任何帮助表示赞赏。

像这样更改您的App.cs

  public App()
    {
        InitializeComponent();

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

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

由于不同的原因,同样的问题......

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

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

Get-Package -updates
Update-Package <package>

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

我实现了具有一个输入字符串的 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 nad 我单击一个按钮,该按钮就会执行: await Shell.Current.Navigation.PushAsync(new SentEmailPage()); 它会抓住一条消息: Object reference not set to an instance of an object.at Xamarin.Forms.ShellSection.OnPushAsync

这解决了我的问题

Device.InvokeOnMainThreadAsync(() =>
{
     Navigation.PushAsync(new CameraPage());
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM