在 xamarin 表单上预加载页面
Posted
技术标签:
【中文标题】在 xamarin 表单上预加载页面【英文标题】:Pre-Load pages on xamarin forms 【发布时间】:2021-11-19 20:35:56 【问题描述】:我正在寻找使我的 Xamarin Forms 应用程序更快的技巧,我遇到了这个article。好吧,我在那里尝试了一些选项,但我发现很难实现最后一个选项;
预加载屏幕:这大大提高了应用程序的性能 本身我们所做的是在每个屏幕、背景、视图上加载 以及接下来需要的视图模型,因此当将它们推送到 他们已经加载了导航堆栈。这减少了很多 页面之间的过渡时间。在我看来这是一个不错的选择,我所做的是将我可能需要的页面插入到堆栈中,然后像这样导航到页面;但是,我不知道我这样做是否正确。
public ProductHomePageViewModel()
Application.Current.MainPage.Navigation.InsertPageBefore(new TilePage(), Application.Current.MainPage.Navigation.NavigationStack[0]);
但这在主页上完成时效果不佳,点击后退按钮应退出应用程序。但在这种情况下,单击后退按钮会导航到堆栈中的下一页。
请帮助我了解如何预加载页面。任何建议都是好的。谢谢!
【问题讨论】:
你粘贴的代码确实不行。使用InsertPageBefore
只是更改导航堆栈并执行您所说的操作,当您按下后退按钮时,它会转到“上一个”页面。实现您想要的一种方法可能是在后台创建页面实例并将其保存在内存中。然后只需推送创建的页面
你的想法价值超过一百万美元@Juan Sturla。请问我该怎么做,任何示例代码都会对我有很大帮助。我从未尝试过。
通常我们使用Navigation.PushAsync(new MyPage())
。但是我们可以将其分为两个步骤:MyPage pageVar= new Page();
并在另一个步骤中执行 Navigation.PushAsync(pageVar)
该 pageVar 可以在您的代码中的任何位置。你甚至可以实现类似Singleton
创建 MyPage 实例时请注意,因为 MyPage 的构造函数只会运行一次
【参考方案1】:
就像我在 cmets 中所说,您可以使用某种单例模式,但对于页面。
我会举一个例子。考虑以下代码
public partial class Page1 : ContentPage
private static Page1 _myinstance;
public static Page1 myinstance
get
Prepare();
return _myinstance;
public static void Prepare()
if (_myinstance == null)
_myinstance = new Page1();
public Page1()
InitializeComponent();
对于任何其他页面,您可以致电 Navigation.PushAsync(Page1.Instance)
。如果 Page1 被实例化,它将不会再次运行构造函数,只会在第一次调用 Instance 时运行。
但如果你想事先“准备”它,你可以在后台方法中调用Page1.Prepare()
请记住,构造函数只会执行一次。所以页面会像“缓存”
【讨论】:
非常感谢您的曝光。然而,Singleton 大多数时候都有无参数的单一构造函数。这通常会使传递参数变得困难,也许当用户单击按钮或列表视图以导航到详细信息页面或其他内容时 是的,您可能会公开另一种方法来执行该配置或传递参数。可能会有点乱 是的,非常混乱,如果需要的话,很难对整个事情进行单元测试。然而,你在这里真的让我接触到了一个很棒的概念。谢谢@Juan Sturla以上是关于在 xamarin 表单上预加载页面的主要内容,如果未能解决你的问题,请参考以下文章