通过在Xamarin.Forms的NavigationPage

时间:2015-07-02 07:47:56

标签: android xamarin xamarin.forms

我有一个Xamarin.Forms NavigationPage,我注意到在推了很多页面(比如20)之后,应用程序开始变得迟钝,并且可能会在某些时候冻结。我猜它必须使用大量内存(我现在应该检查Android的监控工具,我想到了它。)

我是否有另一种方式可以提供历史记录功能(因此,用户可以随时按回去他们之前阅读的地方),这样就不会占用所有内存?我知道这是可能的,因为它是在其他应用程序中完成的。

1 个答案:

答案 0 :(得分:2)

对于具有多个页面和大型导航堆栈的解决方案您可以使用PagesFactory:

public static class PagesFactory
{
    static readonly Dictionary<Type, Page> pages = new Dictionary<Type, Page>();

    static NavigationPage navigation;
    public static NavigationPage GetNavigation()
    {
        if (navigation == null)
        {
            navigation = new NavigationPage(PagesFactory.GetPage<Views.MainMenuView>());
        }
        return navigation;
    }

    public static T GetPage<T>(bool cachePages = true) where T : Page
    {
        Type pageType = typeof(T);

        if (cachePages)
        {
            if (!pages.ContainsKey(pageType))
            {
                Page page = (Page)Activator.CreateInstance(pageType);
                pages.Add(pageType, page);
            }

            return pages[pageType] as T;
        }
        else
        {
            return Activator.CreateInstance(pageType) as T;
        }
    }

    public static async Task PushAsync<T>() where T : Page
    {
        await GetNavigation().PushAsync(GetPage<T>());
    }

    public static async Task PopAsync()
    {
        await GetNavigation().PopAsync();
    }

    public static async Task PopToRootAsync()
    {
        await GetNavigation().PopToRootAsync();
    }

    public static async Task PopThenPushAsync<T>() where T : Page
    {
        await GetNavigation().PopAsync();
        await GetNavigation().PushAsync(GetPage<T>());
    }
}