首页 > 解决方案 > 在 Xamarin.Forms MvvmCross 中存储视图

问题描述

我有一个有四个主要页面的应用程序,通过标签栏切换(没有“后退”按钮)。一页有很多内容(ScrollView),并且需要几秒钟才能呈现。我通过在工作完成时显示“加载”覆盖来处理这个问题。但是对于那个特定的页面,我想让视图保持活动状态,这样当用户切换到另一个页面并稍后返回时,页面就准备好了,而无需再次加载所有内容。不过,我不确定如何在 MvvmCross 中做到这一点。

我确实阅读了文档,据我了解,View Presenter将是正确的方法,因为文档说:

“您的应用程序可以通过提示请求的另一种演示更改包括清除/修改 BackStack,在保持现有视图的同时更改根目录,......可能性真的无穷无尽。您的应用程序再次成为王者!”

我想我需要为此创建一个自定义 MvxPresentationHint,但我不太明白:( 我将如何或者更确切地说在哪里访问和存储/加载视图?

我通常对 MvvmCross(它是如何工作的)特别是对 Mvx 类的定制仍然很不熟悉,尽管我已经使用了一段时间。任何解释和最好的代码示例超出文档中所写的内容,将不胜感激!

标签: xamarin.formsmvvmcross

解决方案


尝试在 MVVM 中“存储”视图是没有意义的。XF 视图表示将使用本机(例如“Android”或“iOS”)小部件创建的内容。创建和测量/布置这些原生小部件是缓慢的。MVVM View Presenter 不会加速该逻辑。

您需要“保持活力”,而不是“存储”:

对于ContentPage被调用的MyPage,当您创建它时,将其存储在静态变量中。然后重新使用该变量。如果您只需要其中一个,则可以将其存储在类本身中。

修改“后面的代码”,MyPage.xaml.cs

public partial class MyPage : ContentPage
{
    // Singleton Pattern.
    private static MyPage _it;
    public static MyPage It {
        get {
            if (_it == null)
                _it = new MyPage();
            return _it;
        }
    }

    // "private", because calling this directly defeats the purpose. Instead, use `MyPage.It`.
    private MyPage()
    {
        InitializeComponent();
    }
}

要创建它,无论您放在哪里:

new MyPage()

而是把这个:

MyPage.It

例如,您可能会这样做PushAsync(MyPage.It);

这将始终返回 MyPage 的相同实例。所以一旦它被创建,它就会保持它的状态。

重要提示:请注意,构造函数仅调用一次。每次页面出现时需要完成的任何代码,放入override .. OnAppearing()方法中。

限制:视图在被操作时“期望”成为视觉层次结构的一部分。如果您尝试更改不在屏幕上的页面或其视图模型,您可能会遇到问题。这些超出了此答案的范围 - 创建一个新的 StackOverflow 问题,其中包含您遇到的任何问题的详细信息。


推荐阅读