xamarin.forms - 在 Xamarin.Forms MvvmCross 中存储视图
问题描述
我有一个有四个主要页面的应用程序,通过标签栏切换(没有“后退”按钮)。一页有很多内容(ScrollView),并且需要几秒钟才能呈现。我通过在工作完成时显示“加载”覆盖来处理这个问题。但是对于那个特定的页面,我想让视图保持活动状态,这样当用户切换到另一个页面并稍后返回时,页面就准备好了,而无需再次加载所有内容。不过,我不确定如何在 MvvmCross 中做到这一点。
我确实阅读了文档,据我了解,View Presenter将是正确的方法,因为文档说:
“您的应用程序可以通过提示请求的另一种演示更改包括清除/修改 BackStack,在保持现有视图的同时更改根目录,......可能性真的无穷无尽。您的应用程序再次成为王者!”
我想我需要为此创建一个自定义 MvxPresentationHint,但我不太明白:( 我将如何或者更确切地说在哪里访问和存储/加载视图?
我通常对 MvvmCross(它是如何工作的)特别是对 Mvx 类的定制仍然很不熟悉,尽管我已经使用了一段时间。任何解释和最好的代码示例超出文档中所写的内容,将不胜感激!
解决方案
尝试在 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 问题,其中包含您遇到的任何问题的详细信息。
推荐阅读
- node.js - 如何获取包含特定字段的文档?
- c# - aspnet_merge.exe EROR; The relative virtual path 'VE/web_form.aspx' is not allowed here
- python - 我正在尝试使用烧瓶在 html 中显示来自 AJAX 调用的值
- spring-boot - 启动 spring boot 应用程序,导致 java.lang.RuntimeException
- unity3d - 一次滑动移动两个滚动视图
- json - JSON 中缺少的部分
- git - 将 svn 转换为 git
- db2 - IBM DB2 错误 sql 代码 724 & sql 状态 54038
- android - 如何在android中将通知按钮文本更改为小写?
- android - 如何使用contourArea OpenCV计算矩以从最大的blob中找到质心