【问题标题】:OnAppearing in children of TabbedPage is triggered only onceTabbedPage 的子项中的 OnAppearing 仅触发一次
【发布时间】:2017-01-09 08:57:14
【问题描述】:

我在Xamarin.Forms 中有一个TabbedPage

public partial class MainPage : TabbedPage
{
   public MainPage()
   {
      InitializeComponent();

       var playPage = new NavigationPage(new PlayPage())
       {
          Title = "Play",
          Icon = "play1.png"
       };
       var settingsPage = new NavigationPage(new SettingsPage())
       { 
          Title = "Settings",
          Icon = "settings.png"
        };
        var aboutPage = new NavigationPage(new AboutPage())
        {
           Title = "About",
           Icon = "about.png"
        };
        Children.Add(playPage);
        Children.Add(settingsPage);
        Children.Add(aboutPage);
    }

每个子页面都是一个ContentPage,它覆盖了OnAppearing 方法。当我在选项卡之间导航时,我的子页面的内容没有正确更新,进一步的调试告诉我,子页面的 OnAppearing 方法只被调用一次(当 MainPage 首次加载时)。

有人知道为什么OnAppearing 方法只被调用一次吗?我该如何解决这个问题?

更多信息

我的子页面(例如 SettingsPage)包含在触发时使用 Navigation.PushAsync 方法打开另一个 ContentPage 的事件。我希望OnAppearing 方法在从标签页和这些标签页中的导航页切换时也会被调用。 (希望这是有道理的)

【问题讨论】:

标签: c# xamarin xamarin.forms


【解决方案1】:

它只会触发一次,因为当您在选项卡之间导航时视图不会被破坏。

您可以使用CurrentPageChanged 事件来判断页面已更改,并指示它更改为的视图并执行您需要的任何视图更新。

this.CurrentPageChanged += PageChanged;

void PageChanged(object sender, EventArgs args)
{
    var currentPage = CurrentPage as MyTabPage;
    currentPage?.UpdateView();
}

然后在你的页面中:

public void UpdateView()
{
    // do whatever you need here to update the page
}

【讨论】:

  • @Cheesebaron 我必须为每个标签页执行此操作吗?
【解决方案2】:

不要将您的 ContentPages 嵌入“单一”级别 NavigationPage

就在标签之间切换时触发OnAppearing 事件而言,以下工作正常:

public class PlayPage : ContentPage
{
    protected override void OnAppearing()
    {
        System.Diagnostics.Debug.WriteLine("PlayPage");
        base.OnAppearing();
    }
}
public class AboutPage : ContentPage
{
    protected override void OnAppearing()
    {
        System.Diagnostics.Debug.WriteLine("AboutPage");
        base.OnAppearing();
    }
}
public class SettingsPage : ContentPage
{
    protected override void OnAppearing()
    {
        System.Diagnostics.Debug.WriteLine("SettingPage");
        base.OnAppearing();
    }
}

public partial class MainPage : TabbedPage
{
    public MainPage()
    {
        var playPage = new PlayPage() { Title = "Play" };
        var settingsPage = new SettingsPage() { Title = "Settings" };
        var aboutPage = new AboutPage() { Title = "About" };
        Children.Add(playPage);
        Children.Add(settingsPage);
        Children.Add(aboutPage);
    }
}

public class App : Application
{
    public App()
    {
        this.MainPage = new MainPage(); 
    }
}

【讨论】:

  • 感谢您的快速回复。但我想将导航栏保留在每个子页面的顶部。而且,当我使用这种方法时,子页面图标下方的Title 使用我在 ContentPage 上设置的标题。我的子页面也有使用Navigation.PushAsync 打开另一个页面的链接
  • @iamsophia 在这种情况下,您可以保留导航页面,OnAppearing 事件仍然有效。它绑定到Page创建/销毁,它不是一个生命循环事件,它是一个视图循环事件,即On iOS 它被链接ViewDidAppear 并且在显示“视图”时会触发,无论是第一次还是一百次。在 Android 上,它链接到 FragmentManager 并且每次显示 View 时都会触发。查看每个平台的 PageRenderer 代码,您将看到如何/何时触发(取决于视图,而不是取决于创建)。
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2011-08-13
  • 2020-08-25
  • 1970-01-01
  • 2022-01-03
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多